2016-06-06 2 views
1

У меня есть код, который сначала пытается найти файлы PDF. Если ему не удается найти даже один файл PDF, он продолжает поиск, например. .TIF в одной папке.Как последовательно искать файлы и сохранять их?

Однако у меня есть две проблемы. Во-первых, когда он находит файл PDF в папке, он также печатает все .TIF-файлы в TXT-файле. Но когда он не находит PDF-файл, он просто останавливается (даже без перерыв) и не создает .txt-файл. Я смущен, и любая помощь приветствуется.

b = os.walk('C:\\Users\\USER\\Desktop\\FOLDER') 
os.listdir('C:\\Users\\USER\\Desktop\\FOLDER') 
f = [] 
for(dirpath, dirnames, filenames) in b: 
    if f.extend(os.path.splitext(name)[0] for name in filenames if name.lower().endswith((".pdf"))) == []: 
     pass 
     break 
    elif f.extend(os.path.splitext(name)[0] for name in filenames if name.lower().endswith((".tif"))) == []: 
     pass 


def save_to_file(text): 
    for name in f: 
     with open('C:\\Users\\USER\\Desktop\\FOLDER\\test.txt', mode='wt', encoding='utf-8') as myfile: 
      myfile.write('\n'.join(text)) 
      myfile.write('\n') 

save_to_file(f) 
+2

'f.extend' всегда возвращает' None', поэтому он не имеет дела в предложении 'if'. –

+0

, но если я использую только имя.lower(). Endswith (..), то он не работает ни – Naj

ответ

2

Попробуйте это:

import os 

def gather_files(folder, ending): 
    contents = os.walk(folder) 
    files = [] 
    for (dirpath, dirnames, filenames) in contents: 
     files += ([file.splitext()[0] for file in filenames if file.lower().endswith(ending)]) 
    return files 


def main(): 
    f = gather_files("test", ".pdf") 
    if not f: 
     f = gather_files("test", ".tif") 

    if not f: 
     print("No .pdf or .tif files found in the given directory.") 
    else: 
     with open("test_out.txt", "w", encoding="utf-8") as output: 
      output.write("\n".join(f) + "\n") 

if __name__ == "__main__": 
    main() 

Это должно работать для вас. В качестве альтернативы вы можете перенести основную часть на метод gather_files с помощью жестких значений кодировки, таких как папка и окончание, или вы могли бы предоставить ключевое слово «альтернативный_игр» или что-то в этом методе.

Возможно, еще раз посмотрите на свой код. У вас есть метод save_to_file (текст), вы вызываете его с f, и в нем вы перебираете f. Вероятно, опечатка, вы должны перебирать текст, а не f. Но вам не нужно итерации вообще, потому что текст (или f) содержит имена файлов в виде списка строк. Таким образом,

with open("test_out.txt", "w", encoding="utf-8") as output: 
    output.write("\n".join(text) + "\n") 

сделает все, что вы пожелаете.

+0

Спасибо Тобиасу, но я не могу создать файл .txt с выходом? Я такой noob .. – Naj

+0

Вы получаете сообщение об ошибке? Может быть, у вас нет доступа на запись в каталог, который вы хотите написать, или что-то в этом роде? Помните, что если в папке нет файлов .pdf/.tif, файл .txt не создается, но сценарий выводит сообщение. – TobiasTomski

+0

Ничего, это работает. Тем не менее, теперь я получаю расширения, и если вы посмотрите на код, который я дал, то это с splitext, поэтому он создает txt-файл без расширений. Но в противном случае он отлично работает! – Naj