У меня есть корневой каталог, содержащий множество подкаталогов, каждый из которых содержит файл с именем data.txt. Я хотел бы написать сценарий, который принимает "корневой" каталог, затем читает все подкаталоги и читает каждый "data.txt" в подкаталогах, а затем записывает материал из каждого файла data.txt в выходной файл.
Вот фрагмент моего кода:
import os
import sys
rootdir = sys.argv[1]
with open('output.txt','w') as fout:
for root, subFolders, files in os.walk(rootdir):
for file in files:
if (file == 'data.txt'):
#print file
with open(file,'r') as fin:
for lines in fin:
dosomething()
Моя часть dosomething() -- я'протестировал и подтвердил, что она работает, если я запускаю эту часть только для одного файла. Я'также подтвердил, что если я скажу ему распечатать файл вместо этого (закомментированная строка), скрипт распечатает 'data.txt'.
Сейчас, если я запускаю его, Python выдает мне эту ошибку:
File "recursive.py", line 11, in <module>
with open(file,'r') as fin:
IOError: [Errno 2] No such file or directory: 'data.txt'
Я не уверен, почему он не может найти его - в конце концов, он печатает data.txt, если я откомментирую строку 'print file'. Что я делаю неправильно?
Вам нужно использовать абсолютные пути, ваша переменная file
- это просто локальное имя файла без пути к каталогу. Переменная root
и есть этот путь:
with open('output.txt','w') as fout:
for root, subFolders, files in os.walk(rootdir):
if 'data.txt' in files:
with open(os.path.join(root, 'data.txt'), 'r') as fin:
for lines in fin:
dosomething()
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir)
for filename in filenames]
Функциональный подход для получения дерева выглядит короче, чище и питоничнее.
Вы можете обернуть os.path.join(dirpath, filename)
в любую функцию для обработки полученных файлов или сохранить массив путей для дальнейшей обработки