webentwicklung-frage-antwort-db.com.de

Muss ich den vollständigen Pfad einer Datei in einem anderen Verzeichnis übergeben, um open () zu öffnen?

Ich habe einen Ordner mit zehn Dateien, die ich durchlaufen möchte. Wenn ich den Namen der Datei ausdrucken, funktioniert mein Code einwandfrei:

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

Welche Drucke:

1
2
3
4
5
6
7
8
9
10

Aber wenn ich versuche, die Datei in der Schleife zu öffnen, erhalte ich die Fehlermeldung 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'
>>> 

Muss ich den vollständigen Pfad der Datei auch innerhalb der Schleife an open() übergeben?

62
balcoder

Ja, Sie benötigen den vollständigen Pfad.

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

Ist die schnelle Lösung. Wie der Kommentar zeigte, os.walk wird in Unterverzeichnisse zerlegt, daher müssen Sie das aktuelle Stammverzeichnis anstelle von indir als Basis für den Pfad-Join verwenden.

26
koblas

Wenn Sie nur nach Dateien in einem einzelnen Verzeichnis suchen (dh Sie nicht versuchen, einen Verzeichnisbaum zu durchlaufen, wie er nicht aussieht) , warum nicht einfach os.listdir () benutzen:

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

anstelle von os.walk () . Sie können einen Verzeichnispfad als Parameter für os.listdir () angeben. os.path.isfile () bestimmt, ob der angegebene Dateiname für eine Datei ist.

92
Levon

Sie müssen den Pfad angeben, an dem Sie arbeiten:

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')
8
Mustafa

Die Beispiele zu os.walk in die Dokumentation zeigen, wie das geht:

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

Wie haben Sie erwartet, dass die Funktion "open" weiß, dass die Zeichenfolge "1" "/ home/des/test/1" bedeuten soll (es sei denn, "/ home/des/test" ist zufällig Ihr aktuelles Arbeitsverzeichnis)?

4
abarnert

Hier ist ein Ausschnitt, der den Dateibaum für Sie durchsucht:

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