web-dev-qa-db-ja.com

Python)でlistdirを使用中にエラーが発生しました

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

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」。誰かがこれについて私を助けてくれますか?

11
Sakura

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

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

次のコードを使用して、コードを呼び出します。

print numOfFiles("client_side")

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

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

3
Sakura

このエラーは、既存のパスを参照していないパス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)])
11
nymk

2つのこと:

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

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

さらに、Python 2.xおよびos.listdirを使用する場合は注意が必要です。これは、u '/ client_side /'と '/ client_side'のみを使用するとWindowsでの結果が異なるためです。

2
schlenk

あなたはただすることができます

os.listdir('client_side')

スラッシュなし。

2
user2174865

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

1
GodMan

あなたが欲しい:

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

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

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

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

1
sissi_luaty

存在の確認は人種の影響を受けます。エラーを処理する方が良い(許可を求める代わりに許しを乞う)。さらに、Python 3ではエラーを抑制できます。contextlibからsuppressを使用してください:

 with suppress(FileNotFoundError):
     for name in os.listdir('foo'):
         print(name)
0
DaveSawyer

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

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

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))

これがお役に立てば幸いです。

0
Joe