2013-10-25 2 views
76

Мне нужно перебирать подкаталоги данной директории и искать файлы. Если я получаю файл, я должен открыть его и изменить содержимое и заменить его на свои собственные строки.Итерация через каталоги с помощью Python

Я попытался это:

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() 

, но я получаю сообщение об ошибке. Что я делаю не так?

+8

«Ошибка» - любая ошибка в частности? –

+0

@ DanielRoseman Он не должен. Код правильный. –

+1

Пожалуйста, не могли бы вы немного рассказать о том, что вы надеетесь делать с файлами/каталогами, как только вы пройдете через них, работая по назначению? Также, пожалуйста, предоставьте сведения об ошибке. – ChrisProsser

ответ

170

Фактическая прогулка по каталогам работает так, как вы ее закодировали. Если заменить содержимое внутреннего цикла с помощью простого print заявления вы можете увидеть, что каждый файл найден:

import os 
rootdir = 'C:/Users/sid/Desktop/test' 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     print os.path.join(subdir, file) 

Если вы все еще получаете ошибки при работе выше, пожалуйста, предоставьте сообщение об ошибке.

+1

C:/Users/sid/Desktop/test \ src \ app/cool.txt C:/Users/sid/Desktop/test \ src \ app/woohoo.txt Ya в открытой инструкции моего кода, Я думаю, что я должен дать абсолютный путь к файлу. импорт ОС RootDir = 'C:/Users/spemmara/Desktop/тест/SRC/приложения /' для подкаталога, DIRS, файлы в os.walk (ROOTDIR): для файла в файлах: х = открыт (subdir + '/' + file, 'r') lines = f.readlines() f.close() f = open (subdir + '/' + file, 'w') для строк в строках: newline = "hey i know" f.write (newline) f.close() Спасибо человеку. Его решение – Wolf

4

Другой способ возвращения всех файлов в подкаталогах, чтобы использовать the pathlib module, введенный в Python 3.4, который обеспечивает ориентированный объектный подход к обработке путей файловой системы (Pathlib также доступна на Python 2.7 через the pathlib2 module on PyPi):

from pathlib import Path 

rootdir = Path('C:/Users/sid/Desktop/test') 
# Return a list of regular files only, not directories 
file_list = [f for f in rootdir.glob('**/*') if f.is_file()] 

# For absolute paths instead of relative the current dir 
file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()] 

Поскольку Python 3.5, то glob модуль также поддерживает рекурсивный файл вывод:

import os 
from glob import iglob 

rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks 
# This will return absolute paths 
file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)] 

file_list из любого из вышеуказанных подходов может быть иТЭР без необходимости вложенной петли:

for f in file_list: 
    print(f) # Replace with desired operations 
+1

Что здесь предпочтительнее для Python 3.6? – PhoenixDev

+0

@PhoenixDev Я не слышал, чтобы один подход был рекомендован другим. Я предпочитаю использовать 'pathlib' сам, в основном потому, что мне нравится объектно-ориентированный метод-синтаксис. Существуют и другие отличия, такие как библиотека путей, возвращающая определенные классы маршрутов, а не строки, а доступные функции различаются между библиотеками (например, 'os.path.expanduser ('~')' vs 'Path.home()'). Просмотрите документацию и посмотрите, какой подход вы предпочитаете. –

Смежные вопросы