2012-08-03 12 views
58

Mam folder z dziesięcioma plikami, które chcę przełączyć. Kiedy wydrukować nazwę pliku mój kod działa poprawnie:Jak zapętlić pliki za pomocą Pythona?

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 

która drukuje:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Ale gdy próbuję otworzyć plik w pętli pojawia się błąd IO:

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(f, 'r') 

Traceback (most recent call last): 
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module> 
log = open(f, 'r') 
IOError: [Errno 2] No such file or directory: '1' 
>>> 

Czy muszę podać pełną ścieżkę pliku, nawet w pętli?

+0

starasz się przechodzić drzewo katalogów, czy po prostu interesują Cię zwykłe pliki w określonym katalogu/folderze? – Levon

+0

Wiem, że to pytanie ma cztery lata, ale nadal nie ma akceptowanej odpowiedzi. – raoulcousins

Odpowiedz

24

Tak, potrzebujesz pełnej ścieżki.

log = open(os.path.join(root, f), 'r') 

Czy to szybka naprawa. Jak zauważył komentarz, os.walk przechodzi w podkatalogi, więc musisz użyć katalogu głównego katalogu zamiast indir jako podstawy dla łączenia ścieżek.

+5

'os.walk' schodzi do podkatalogów, więc nie powinieneś używać tutaj' indir'. Użyj 'root'. –

+1

dobry połów, zaktualizowany. – koblas

92

Jeśli tylko szukasz plików w jednym katalogu (czyli jesteś nie próbując przechodzić drzewo katalogów, które nie wygląda jak), dlaczego nie wystarczy użyć os.listdir():

import os 
for fn in os.listdir('.'): 
    if os.path.isfile(fn): 
     print (fn) 

zamiast os.walk(). Możesz określić ścieżkę katalogu jako parametr dla os.listdir(). os.path.isfile() określa, czy podana nazwa pliku dotyczy pliku.

+0

pętla OP nie tylko drukuje pliki w jednym katalogu. Drukuje pliki (rekurencyjnie) w każdym katalogu, również w katalogu wejściowym. – mgilson

+0

@mgilson Tęsknię za tym, patrząc na kod OP (OP odnosi się tylko do nazw plików, a nie do katalogów), a część pytania czyta "folder z dziesięcioma plikami, które chcę przełączyć." .. czy pominąłem niektóre informacje? – Levon

+0

Jeśli OP ma strukturę katalogów: '.' zawiera' plik1', 'katalog1' i' katalog1' zawiera 'plik2'. kod OP wypisze 'plik1',' plik2', podczas gdy twoje rozwiązanie wypisze 'plik1',' katalog1'. (przepraszam, to naprawdę trudno wyjaśnić w komentarzach). – mgilson

4

przykłady do os.walk w the documentation pokazać, jak to zrobić:

for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(os.path.join(root, f),'r') 

Jak można oczekiwać funkcja "otwarte", aby wiedzieć, że ciąg "1" ma oznaczać „/ home/des/test/1 "(chyba że"/home/des/test "jest twoim bieżącym katalogiem roboczym)?

4

Oto fragment, który będzie chodzić drzewo pliku dla Ciebie:

indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 
     log = open(indir + f, 'r') 
7

Musisz określić ścieżkę, które pracują na:

source = '/home/test/py_test/' 
for root, dirs, filenames in os.walk(source): 
    for f in filenames: 
     print f 
     fullpath = os.path.join(source, f) 
     log = open(fullpath, 'r') 
Powiązane problemy