2013-03-16 9 views
9

Ich versuche, die Liste der Dateien in einem bestimmten Verzeichnis zu erhalten und die Anzahl der Dateien im Verzeichnis zu zählen. Ich bekomme immer folgende Fehlermeldung:Fehler bei der Verwendung von Listdir in Python

WindowsError: [Error 3] The system cannot find the path specified: '/client_side/*.*' 

Mein Code ist:

print len([name for name in os.listdir('/client_side/') if os.path.isfile(name)]) 

ich den Code Beispiel gefolgt gegeben here.

Ich führe das Python-Skript auf Pyscripter und das Verzeichnis/client_side/do existiert. Mein Python-Code befindet sich im Stammordner und hat einen Unterordner namens "client_side". Kann mir jemand dabei helfen?

+1

Ich frage mich nur, ob das etwas mit dem '/' in Windows zu tun hat! Im Idealfall sollten Sie unter Windows so etwas haben wie 'os.path.join ('C:', 'client_side')' – GodMan

Antwort

1

entschied ich mich, in den Code zu ändern:

def numOfFiles(path): 
    return len(next(os.walk(path))[2]) 

und die nach dem Aufruf den Code verwenden:

print numOfFiles("client_side") 

Vielen Dank an alle, die mir erzählt, wie das Windows-Verzeichnis korrekt passieren in Python und nrao91 in here für die Bereitstellung des Funktionscodes.

EDIT: Danke eryksun für die Korrektur meines Codes!

+0

Danke! Ich habe den Teil der Verzeichnisse vergessen. Ich habe meinen Code entsprechend aktualisiert. – Sakura

+1

Gern geschehen. [Nymks Antwort] (http://stackoverflow.com/a/15452633/205580) ist ausgezeichnet, und ich denke, Sie sollten es als die Antwort auf Ihre Frage akzeptieren. – eryksun

1

Wie ich eine WindowsError sehen kann, frage mich nur, ob das etwas mit dem '/' in Windows zu tun hat! Idealerweise auf Windows, sollten Sie so etwas wie os.path.join('C:','client_side')

1

haben Sie wollen: ""

print len([name for name in os.listdir('./client_side/') if os.path.isfile(name)]) 

mit einem vor "/ client_side /".

Der Punkt steht für den aktuellen Pfad, in dem Sie arbeiten (also von wo aus Sie Ihren Code aufrufen), also "./client_side/" steht für den gewünschten Pfad, der relativ zu Ihrem aktuellen Verzeichnis angegeben ist.

Wenn Sie nur "/ client_side /" in Unix schreiben, sucht das Programm nach einem Ordner im Stammverzeichnis des Systems anstelle des gewünschten Ordners.

1

Zwei Dinge:

  1. os.listdir() keinen glob Musterabgleich Verwenden Sie dazu die glob Modul für die
  2. wahrscheinlich haben Sie nicht über ein Verzeichnis mit dem Namen ‚/client_side/*.* ', aber vielleicht eine ohne die . im Namen

Die Syntax Sie funktioniert gut verwendet werden, wenn das Verzeichnis Sie suchen existiert, aber es gibt kein Verzeichnis ‚/ client_side/genannt. '.

Seien Sie außerdem vorsichtig, wenn Sie Python 2.x und os.listdir verwenden, da die Ergebnisse in Windows unterschiedlich sind, wenn Sie u/client_side/und nur/client_side benutzen.

+0

Der Glob wird von 'posix.listdir' hinzugefügt. In Win32 verwendet es ['FindFirstFileW'] (http://msdn.microsoft.com/en-us/library/aa364418) (oder die ANSI-Version für Bytes). Es erlaubt keinen abschließenden Schrägstrich. Anstelle von speziellen Casing-Stammverzeichnissen wie 'C: \' hängt Python einfach '*. *' An. – eryksun

12

Dieser Fehler tritt auf, wenn Sie os.listdir auf einem Pfad verwenden, der sich nicht auf einen vorhandenen Pfad bezieht.
Zum Beispiel:

>>> os.listdir('Some directory does not exist') 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
WindowsError: [Error 3] : 'Some directory does not exist/*.*' 

Wenn Sie os.listdir verwenden mögen, müssen Sie die Existenz des Pfades garantieren, die Sie verwenden würden, oder os.path.exists verwenden, um die Existenz zuerst zu überprüfen.

if os.path.exists('/client_side/'): 
    do something 
else: 
    do something 

Angenommen, Ihr aktuelles Arbeitsverzeichnis c:\foobar ist, os.listdir('/client_side/')-os.listdir('c:/client_side') entspricht, während os.listdir('client_side/') zu os.listdir('c:/foobar/client_side') entspricht.Wenn sich das Verzeichnis client_side nicht im Stammverzeichnis befindet, tritt ein solcher Fehler auf, wenn os.listdir verwendet wird.

Für Ihre 0 ouput Problem, lassen Sie uns os.listdir(path)

Return a list containing the names of the entries in the directory given by path. The list is in arbitrary order. It does not include the special entries '.' and '..' even if they are present in the directory.

und os.path.isfile(path) erinnern. weder

Return True if path is an existing regular file. This follows symbolic links, so both islink() and isfile() can be true for the same path.

listdir kehrt die absoluten Pfade noch relative Pfade, sondern eine Liste der Namen der Dateien, während isfile Pfad erfordert. Daher würden alle diese Namen False ergeben.

Um den Pfad zu erhalten, können wir entweder os.path.join verwenden, Concat zwei Strings direkt.

print ([name for name in os.listdir(path) 
     if os.path.isfile(os.path.join(path, name))]) 

Oder

print ([name for name in os.listdir('client_side/') 
     if os.path.isfile('client_side/' + name)]) 
+0

Hallo. Ich habe jetzt keinen Windows-Fehler, aber es gibt immer die Anzahl der Dateien als 0 aus, obwohl ich 7 Dateien im Ordner habe. Weißt du, warum? – Sakura

+0

@Sakura: weil 'os.listdir' Namen zurückgibt. Sie sollten 'os.path.isfile' nicht für diese Namen verwenden. Ich habe meinen Beitrag aktualisiert und eine vollständige Erklärung gegeben. – nymk

+0

@Sakura Sie sollten wirklich die angenommene Antwort ändern – Antonio

2

Sie haben soeben

os.listdir('client_side') 

ohne Schrägstriche tun.

+0

Hallo. Ich habe jetzt keinen Windows-Fehler, aber es gibt immer die Anzahl der Dateien als 0 aus, obwohl ich 7 Dateien im Ordner habe. Weißt du, warum? – Sakura

Verwandte Themen