2012-05-07 14 views
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 

なぜそれがバックスラッシュをバックスラッシュのでしょうか? エラーを修正するにはどうすればよいですか?あなたの最初の質問

why does it backslash the backslashes?

に関する

+0

私はなぜそれが\を追加するのかわかりません。しかし代わりに "/"を使用しようとしましたか?通常、ほとんどのライブラリと言語で、パスの方がはるかに優れています。 – TheSHEEEP

+0

yepは、まったく同じことを返します。正確に。 – mirandalol

+0

あなたのuserdirの外にあるファイルにアクセスしようとしているので、Windows Vista/7のようなサウンドとアクセス権の問題が発生します。 – mensi

答えて

4

それは表示だけの問題です。 \がエスケープ文字であるため、\の文字列をr'\'または'\\'のいずれかとして指定します。そして、まさにこのように表示されます。言い換えれば、それは正確にはthe repr() functionで再検査されたものです。ところで

:あなたのため、同じ理由に

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

問題がある:\D\Lが有効なエスケープはありませんので、それだけで動作します。あなたはより良い生の文字列、または正しく\ Sをエスケープされた文字列として

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

として

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

としてそれを記述します。


あなたの2番目の質問は、しかし、

and how can I fix the error?

は少しトリッキーです。

私はあなたが複数の再帰に問題があると思います:一方で、walk()は完全にツリーを歩きます。したがって、第2レベルのjoin(path,file)が間違っている場合は、pathrootに置き換えてください。一方、fsize()を再帰的に呼び出すと、ファイルが重複する可能性があります。

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

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

os.walk()は、すべてのディレクトリレベルのためroot, dirs, filesをもたらすことにより、与えられた木を横断します。この例では

、それは

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

が得られますので、rootfiles常駐で現在の処理のディレクトリが含まれています。

私はDaniel's_Booksのサブディレクトリではなく、このディレクトリ内のあなたのcover.jpg存在を仮定自体。それを正しいディレクトリと組み合わせると、それが見つかるでしょう。

+0

問題を修正しませんでした。また、私はSOFを尋ねる前にそれを試しました。投稿前に私の質問を常に研究しています:) – mirandalol

+0

どちらの問題?なぜあなたは '\'のペアがあるのか​​知りたかったので、私はこれに答えました。私は何を取りこぼしたか? – glglgl

+0

申し訳ありませんが、私は十分に明確ではなかったので、os.stat(path).st_size関数を完了できるように\\を削除する方法を知りたいと思っていました。 – mirandalol