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? 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.
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
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