Iteracja poprzez katalogi za pomocą Pythona

Muszę przeszukiwać podkatalogi danego katalogu i szukać plików. Jeśli dostanę plik, muszę go otworzyć i zmienić zawartość i zastąpić go własnymi liniami.

Próbowałem tego:

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()
Ale dostaję błąd. Co robię źle?
Author: omerbp, 2013-10-25

2 answers

Rzeczywisty spacer po katalogach działa tak, jak go zakodowałeś. Jeśli zastąpisz zawartość pętli wewnętrznej prostą instrukcją print, zobaczysz, że każdy plik zostanie znaleziony:

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)

Jeśli nadal występują błędy podczas uruchamiania powyższego, podaj komunikat o błędzie.

 198
Author: ChrisProsser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 15:19:48

Innym sposobem zwracania wszystkich plików w podkatalogach jest użycie modułu pathlib , wprowadzonego w Pythonie 3.4, który zapewnia zorientowane obiektowo podejście do obsługi ścieżek systemu plików (Pathlib jest również dostępny w Pythonie 2.7 poprzez Moduł pathlib2 na 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()]

Od wersji Pythona 3.5, moduł glob obsługuje również rekurencyjne wyszukiwanie plików:

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 z jednego z powyższych podejść można iterować bez potrzeby zagnieżdżania pętla:

for f in file_list:
    print(f) # Replace with desired operations
 5
Author: joelostblom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-28 15:11:38