Мне нужно перебрать подкаталоги данного каталога и искать файлы. Если я получаю файл, я должен открыть его, изменить содержимое и заменить его собственными строками.
Я попробовал это:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
но я получаю ошибку. Что я делаю не так?
Ответы:
Фактическая прогулка по каталогам работает так, как вы ее закодировали. Если вы замените содержимое внутреннего цикла простым
print
оператором, вы увидите, что каждый файл найден:Если вы все еще получаете ошибки при запуске выше, пожалуйста, предоставьте сообщение об ошибке.
Обновлено для Python3
источник
Другой способ возвращения всех файлов в подкаталогах, чтобы использовать в
pathlib
модуль , введенный в Python 3.4, который обеспечивает ориентированный объектный подход к обработке путей файловой системы (Pathlib также доступна на Python 2.7 с помощью модуля pathlib2 на PyPi ):Начиная с Python 3.5,
glob
модуль также поддерживает рекурсивный поиск файлов:file_list
От любого из вышеуказанных подходов может повторяться в течение без необходимости вложенного цикла:источник
pathlib
себя, в основном потому, что мне нравится объектно-ориентированный метод-синтаксис. Существуют и другие различия, например, библиотека путей возвращает определенные классы путей, а не строки, и доступные функции различаются между библиотеками (например,os.path.expanduser('~')
vsPath.home()
). Просмотрите документацию и посмотрите, какой подход вы предпочитаете.**
в шаблон glob, вы можете использоватьrglob
.По состоянию на 2020 г. ,
glob.iglob(path/**, recursive=True)
кажется наиболее вещим решение, а именно:Вывод:
Примечания:
1 - glob.iglob
2 - если рекурсивный
True
, шаблон'**'
будет соответствовать любым файлам и нулю или болееdirectories
иsubdirectories
.3 - Если каталог содержит файлы, начинающиеся с,
.
они не будут сопоставлены по умолчанию. Например, рассмотрим каталог, содержащийcard.gif
и.card.gif
:4 - Вы также можете использовать
rglob(pattern)
, что аналогично вызовуglob()
с**/
добавленным перед данным относительным шаблоном.источник