Сохранение файлов .txt в другой папке на Python - PullRequest
0 голосов
/ 05 июля 2018

Есть легкая текстовая поисковая система. Он просматривает файлы .txt в одной папке, ищет выбранный термин и отображает имя файла. Все основано на функциональности библиотеки os:

import os

dirname = '/Users/user/Desktop/test/reports'
save_path = '/Users/user/Desktop/test/folder'

search_terms = ['card']
search_terms = [x.lower() for x in search_terms]
Word = ''.join(search_terms)

for f in os.listdir(dirname):
    with open(os.path.join(dirname,f), "r", encoding="latin-1") as infile:
        text =  infile.read()

    if all(term in text for term in search_terms):
        print (f)
        os.path.join(save_path,f)  

3001017.txt
3003402.txt
3002866.txt
3003763.txt
3004961.txt
3003834.txt
3001986.txt

Поиск работает сам по себе, но в качестве последней операции я хочу сохранить файлы .txt, полученные в результате, в другой папке save_path. Для этого я пытаюсь использовать os.path.join(save_path,f), но кажется, что он не работает. , Каков будет правильный подход к этому?

1 Ответ

0 голосов
/ 05 июля 2018

os.path.join only объединяет строки в виде пути и не имеет ничего общего с сохранением данных в файл.

Обратитесь к этому примеру, который использует модуль pathlib

In [1]: from pathlib import Path

In [3]: p = Path.cwd()

In [4]: p
Out[4]: PosixPath('/home/bluesmonk')

In [7]: p.stem
Out[7]: 'bluesmonk'

In [9]: p.is_dir()
Out[9]: True

In [10]: p2 = p.joinpath('foo') # path does not exist

In [11]: p2.is_dir()
Out[11]: False

Обратите внимание, что создание p2 ничего не создает в файловой системе.

Что касается сохранения файлов, вам необходимо указать mode в качестве второго параметра, который является 'w' режимом для записи . Проверьте документацию для получения дополнительной информации.

In [12]: with open(p.joinpath('foo.txt'), 'w') as saved_file:
    ...:     txt = 'hello world!'
             print(saved_file)
    ...:     saved_file.write(txt)
    ...:     
<_io.TextIOWrapper name='/home/bluesmonk/foo.txt' mode='w' encoding='UTF-8'>


In [13]: ls
 Code/       Documents/         Library/    Public/      Vagrant/
 Desktop/    Downloads/         Music/      snap/        Videos/
 foo.txt     examples.desktop   Pictures/   Templates/  'VirtualBox VMs'/

In [14]: cat foo.txt
hello world!

Ваш код при этом будет выглядеть как

for f in os.listdir(dirname):
    with open(os.path.join(dirname,f), "r", encoding="latin-1") as infile:
        text =  infile.read()

    if all(term in text for term in search_terms):
        print (f)
        with open(os.path.join(save_path,f), 'w') as sf:
            sf.write(text) 

Обратите внимание, что pathlib предоставляет, среди прочих, read_text и write_text методы.

...