11

特定のディレクトリ内のファイルのリストを取得して、ディレクトリ内のファイルの数を数えようとしています。私は常に次のエラーを受け取ります:

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

私のコードは次のとおりです。

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

ここに示したコード例に従いました。

PyscripterでPythonスクリプトを実行していますが、ディレクトリ/ client_side/doが存在します。私のPythonコードはルートフォルダにあり、「client_side」というサブフォルダがあります。誰かがこれについて私を助けることができますか?

4

8 に答える 8

14

このエラーは、既存のパスを参照していないパスos.listdirで使用すると発生します。 例えば:

>>> 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/*.*'

を使用する場合はos.listdir、使用するパスの存在を保証するか、os.path.exists最初に を使用して存在を確認する必要があります。

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

現在の作業ディレクトリがc:\foobaros.listdir('/client_side/')あるとします。 は に相当しos.listdir('c:/client_side')os.listdir('client_side/')は に相当しos.listdir('c:/foobar/client_side')ます。client_side ディレクトリがルートにない場合、 を使用するとこのようなエラーが発生しos.listdirます。

0 出力の問題については、思い出してみましょうos.listdir(path)

パスで指定されたディレクトリ内のエントリの名前を含むリストを返します。リストは任意の順序です。特別なエントリ「.」は含まれません。および「..」は、ディレクトリに存在する場合でも。

os.path.isfile(path)

pathが既存の通常ファイルの場合は True を返します。これはシンボリック リンクをたどるので、同じパスに対して islink() と isfile() の両方が true になる可能性があります。

listdir絶対パスも相対パスも返しませんが、ファイルの名前のリストを返しますが、パスがisfile必要です。したがって、これらの名前はすべてFalse.

パスを取得するには、 を使用するかos.path.join、2 つの文字列を直接連結します。

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

または

print ([name for name in os.listdir('client_side/')
        if os.path.isfile('client_side/' + name)])
于 2013-03-16T17:55:29.097 に答える
3

コードを次のように変更することにしました。

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

以下を使用してコードを呼び出します。

print numOfFiles("client_side")

Python で Windows ディレクトリを正しく渡す方法を教えてくれたすべての人、および関数コードを提供してくれた nrao91 に感謝します。

編集:私のコードを修正してくれてありがとうeryksun!

于 2013-03-17T03:52:54.590 に答える
2

2つのこと:

  1. os.listdir() は glob パターンマッチングを行いません。そのためにはglobモジュールを使用してください
  2. おそらく、「/client_side/*.*」というディレクトリはありませんが、. 名前に

探しているディレクトリが存在する場合、使用した構文は正常に機能しますが、「/client_side/」というディレクトリはありません'。

さらに、Python 2.x と os.listdir を使用する場合は注意してください。u'/client_side/' と '/client_side' のみを使用すると、Windows での結果が異なります。

于 2013-03-16T17:19:36.050 に答える
2

あなたはちょうどすることができます

os.listdir('client_side')

スラッシュなし。

于 2013-03-16T18:34:47.067 に答える
1

あなたがしたい:

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

とともに "。" 「/client_side/」の前。

ドットは、作業中の現在のパス (つまり、コードを呼び出している場所) を意味するため、「./client_side/」は、現在のディレクトリに対して相対的に指定された必要なパスを表します。

「/client_side/」のみを記述すると、UNIX では、プログラムは必要なフォルダーではなく、システムのルートにあるフォルダーを探します。

于 2013-03-16T17:19:06.270 に答える
1

私が見ることができるようにWindowsError、これがWindowsの「/」と関係があるかどうか疑問に思っています! 理想的には、Windowsでは、次のようなものが必要ですos.path.join('C:','client_side')

于 2013-03-16T17:16:05.273 に答える
0

スクリプトが置かれているディレクトリ内のすべてのファイルを表示したいだけの場合は、os.path.dirname(sys.argv[0]). これにより、スクリプトが存在するディレクトリのパスが得られます。

次に、関数を使用して、変数fnmatchで指定された名前および/または拡張子を持つそのディレクトリ内のファイルのリストを取得できます。filename

import os,sys
from fnmatch import fnmatch

directory = os.path.dirname(sys.argv[0])    #this determines the directory
file_name= "*"                              #if you want the python files only, change "*" to "*.py"

for path, subdirs, files in os.walk(directory):
    for name in files:
        if fnmatch(name, file_name):
            print (os.path.join(path, name))

これが役立つことを願っています。

于 2019-03-05T18:03:00.220 に答える