特定のディレクトリ内のファイルのリストを取得して、ディレクトリ内のファイルの数を数えようとしています。私は常に次のエラーを受け取ります:
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)])
here というコード例に従いました。
PyscripterでPythonスクリプトを実行していて、ディレクトリ/ client_side /が存在します。私のpythonコードはルートフォルダーにあり、次のサブフォルダーがあります。 「client_side」。誰かがこれについて私を助けてくれますか?
コードを次のように変更することにしました。
def numOfFiles(path):
return len(next(os.walk(path))[2])
次のコードを使用して、コードを呼び出します。
print numOfFiles("client_side")
関数コードを提供してくれたPythonと here のnrao91にWindowsディレクトリを正しく渡す方法を教えてくれたすべての人に感謝します。
編集:私のコードを修正してくれてありがとうeryksun!
このエラーは、既存のパスを参照していないパスで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:\foobar
であり、os.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)
パスで指定されたディレクトリ内のエントリのnamesを含むリストを返します。リストは任意の順序です。特別なエントリ「。」は含まれません。および「..」は、ディレクトリに存在する場合でも同様です。
および 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)])
2つのこと:
使用した構文は、探しているディレクトリが存在するが、「/ client_side /。」というディレクトリがない場合は正常に機能します。
さらに、Python 2.xおよびos.listdirを使用する場合は注意が必要です。これは、u '/ client_side /'と '/ client_side'のみを使用するとWindowsでの結果が異なるためです。
あなたはただすることができます
os.listdir('client_side')
スラッシュなし。
WindowsError
を見ることができるように、これがWindowsの「/」と関係があるのかどうか疑問に思っています。理想的には、Windowsでは、os.path.join('C:','client_side')
のようなものが必要です。
あなたが欲しい:
print len([name for name in os.listdir('./client_side/') if os.path.isfile(name)])
とともに "。" 「/ client_side /」の前。
ドットは、作業している現在のパス(つまり、コードを呼び出している場所)を意味します。したがって、「。/client_side /」は、現在のディレクトリに対して相対的に指定される、必要なパスを表します。
UNIXで「/ client_side /」のみを記述した場合、プログラムは、必要なフォルダーではなく、システムのルートにあるフォルダーを検索します。
存在の確認は人種の影響を受けます。エラーを処理する方が良い(許可を求める代わりに許しを乞う)。さらに、Python 3ではエラーを抑制できます。contextlibからsuppressを使用してください:
with suppress(FileNotFoundError):
for name in os.listdir('foo'):
print(name)
スクリプトが配置されているディレクトリ内のすべてのファイルを表示したいだけの場合は、os.path.dirname(sys.argv[0])
を使用できます。これにより、スクリプトが存在するディレクトリのパスがわかります。
次に、fnmatch
関数を使用して、filename
variableで指定された名前や拡張子を持つそのディレクトリ内のファイルのリストを取得できます。
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))
これがお役に立てば幸いです。