0

ディレクトリサイズを取得する関数を取得しようとしています。

def fsize(path, returntype='b'):
    size = 0
    if isdir(path):
        for root, dirs, files in walk(path):
            for file in files:
                size += getsize(join(path,file))

    else:
        print abspath(path)
        size = getsize(abspath(path))

    if returntype != 'b':
        return convert_size(size, returntype)
    return size

path = r"D:\Library\Daniel's_Books"

print fsize(path, 'm')

そして、私はこの面白いエラーを受け取ります:

size = getsize(abspath(path))
File "C:\Python27\lib\genericpath.py", line 49, in getsize
return os.stat(filename).st_size
WindowsError: [Error 2] The system cannot find the file specified: "D:\\Library\\Daniel's_Books\\cover.jpg"
D:\Library\Daniel's_Books\cover.jpg

バックスラッシュをバックスラッシュするのはなぜですか?どうすればエラーを修正できますか?

4

1 に答える 1

4

最初の質問について

バックスラッシュをバックスラッシュするのはなぜですか?

それは単に表示の問題です。\エスケープ文字と同様に、 asまたは as\のいずれかで sを含む文字列を指定します。そして、まさにこのように表示されます。つまり関数によって返されたとおりに表示されます。r'\''\\'repr()

ところで:あなたの

path = "D:\Library\Daniel's_Books"

同じ理由で問題があります: と が有効なエスケープではないためにのみ機能し\Dます\L。のように書いたほうがよいでしょう。

path = r"D:\Library\Daniel's_Books"

生の文字列として、または

path = "D:\\Library\\Daniel's_Books"

適切にエスケープされた\s を含む文字列として。


ただし、2番目の質問は、

どうすればエラーを修正できますか?

少しトリッキーです。

複数の再帰に問題があると思います。一方で、walk()ツリーを完全にウォークスルーします。したがって、第 2 レベル以降join(path,file)は、間違っているため、 に置き換える必要がありpathますroot。一方、fsize()再帰的に呼び出すと、ファイルが重複する可能性があります。

次のツリーがあるとします。

.
+- A
|  +- a
|  +- b
+- B
|  +- a
|  +- b
+- a
+- b

os.walk()root, dirs, filesすべてのディレクトリ レベルを明け渡して、指定されたツリーをトラバースします。

この例では、

'.', ['A', 'B'], ['a', 'b']
'.\\A', [], ['a', 'b']
'.\\B', [], ['a', 'b']

rootが存在する現在の処理ディレクトリが含まれていfilesます。

このディレクトリ自体ではなく、cover.jpgのサブディレクトリにあると思います。Daniel's_Booksそれを正しいディレクトリと組み合わせると、それが見つかります。

于 2012-05-07T11:05:41.000 に答える