【问题标题】:Path suddenly gets backslashed路径突然被反斜杠
【发布时间】:2012-05-15 21:13:36
【问题描述】:

我正在尝试获取获取目录大小的函数。

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

为什么反斜杠反斜杠? 我该如何解决这个错误?

【问题讨论】:

  • 我不确定为什么它会添加额外的\。但是您是否尝试过使用“/”来代替?对于大多数库和语言,它通常对路径效果更好。
  • 是的,返回完全相同的东西。完全正确。
  • 听起来像 windows vista/7 和权限问题,因为您试图访问用户目录之外的文件...

标签: python windows file path size


【解决方案1】:

关于你的第一个问题

为什么反斜杠反斜杠?

这只是展示的问题。由于\ 是转义字符,您可以将带有\s 的字符串作为r'\''\\' 提供。也正是以这种方式显示,换句话说:与the repr() function 返回的完全一样。

顺便说一句:你的

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

由于相同的原因而存在问题:它仅在 \D\L 没有有效转义时才有效。你最好写成

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

作为原始字符串或

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

作为带有正确转义的\s 的字符串。


然而,你的第二个问题,

我该如何解决这个错误?

有点棘手。

我认为你有多重递归的问题:一方面,walk() 完全穿过树。所以从第二层开始,join(path,file) 是错误的,你应该用root 替换path。另一方面,您递归调用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 的子目录中,而不是在此目录本身中。将它与正确的目录结合起来就可以找到它。

【讨论】:

  • 没有解决问题。还;我在 SOF 上提问之前尝试过,我总是在发布之前研究我的问题 :)
  • 哪个问题?你想知道为什么会有双``,我回答了这个。我错过了什么?
  • 对不起,我说的不够清楚,我想知道如何消除 \\ 以便它可以完成 os.stat(path).st_size 功能。
  • 你不想限制它们,它们只是展示的问题。相反,请参阅我的编辑。
猜你喜欢
  • 2012-11-16
  • 2013-07-23
  • 2012-08-30
  • 2014-02-04
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多