35

我有一本字典:

my_dictionary = {"058498":"table", "064165":"pen", "055123":"pencil"}

我遍历它:

for item in my_dictionary:
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item
    doIt(PDF)

def doIt(PDF):
    part = MIMEBase('application', "octet-stream")
    part.set_payload( open(PDF,"rb").read() )

但我得到这个错误:

IOError: [Errno 2] No such file or directory: 'C:\\Users\\user\\Desktop\\File_055123.pdf'

它找不到我的文件。为什么它认为文件路径中有双反斜杠?

4

5 回答 5

23

双反斜杠没有错,python向用户表示它的方式。在每个双反斜杠\\中,第一个转义第二个以暗示实际的反斜杠。如果a = r'raw s\tring'b = 'raw s\\tring'(没有 'r' 和显式双斜杠),那么它们都表示为'raw s\\tring'.

>>> a = r'raw s\tring'
>>> b = 'raw s\\tring'
>>> a
'raw s\\tring'
>>> b
'raw s\\tring'

为了澄清起见,当您打印字符串时,您会看到它会被使用,就像在路径中一样 - 只有一个反斜杠:

>>> print(a)
raw s\tring
>>> print(b)
raw s\tring

在这个打印字符串的情况下,\t并不意味着tab,它是一个反斜杠,\后跟字母 't'。

否则,没有 'r' 前缀和单个反斜杠的字符串将转义它后面的字符使其评估它后面的 't' == 制表符:

>>> t = 'not raw s\tring'  # here '\t' = tab
>>> t
'not raw s\tring'
>>> print(t)  # will print a tab (and no letter 't' in 's\tring')
not raw s       ring

所以在PDF路径+名称中:

>>> item = 'xyz'
>>> PDF = r'C:\Users\user\Desktop\File_%s.pdf' % item
>>> PDF         # the representation of the string, also in error messages
'C:\\Users\\user\\Desktop\\File_xyz.pdf'
>>> print(PDF)  # "as used"
C:\Users\user\Desktop\File_xyz.pdf

有关表中转义序列的更多信息。另见__str__vs__repr__

于 2012-08-12T18:48:12.420 回答
12

双反斜杠是由于r原始字符串:

r'C:\Users\user\Desktop\File_%s.pdf' ,

使用它是因为\可能会转义某些字符。

>>> strs = "c:\desktop\notebook"

>>> print strs                #here print thinks that \n in \notebook is the newline char
c:\desktop
otebook

>>> strs = r"c:\desktop\notebook"  #using r'' escapes the \
>>> print strs

c:\desktop\notebook

>>> print repr(strs)   #actual content of strs
'c:\\desktop\\notebook'
于 2012-08-12T18:37:49.323 回答
3

它没有。双反斜杠只是计算机说反斜杠的方式。是的,我知道这听起来很奇怪,但是这样想——为了表示特殊字符,选择了反斜杠作为转义字符(例如,\n 表示换行符,而不是后跟 n 字符的反斜杠字符)。但是,如果您确实想打印(或使用)一个反斜杠(可能后跟更多字符),但又不希望计算机将其视为转义字符,会发生什么?在这种情况下,我们将反斜杠本身转义,这意味着我们使用双反斜杠,以便计算机将理解它是单个反斜杠。

r由于您在字符串之前添加了,它会在您的情况下自动完成。

于 2012-08-12T18:39:55.480 回答
3

避免头痛,您也可以使用其他斜线。如果你知道我在说什么。相反的斜线。

你现在正在使用 PDF = 'C:\Users\user\Desktop\File_%s.pdf' %item

尝试使用**

PDF = 'C:/Users/user/Desktop/File_%s.pdf' %item

** 它不会被视为转义字符。

于 2017-05-30T05:18:47.360 回答
-1

alwbtc@我敢说:“我发现了bug……”

代替

PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item
doIt(PDF)`

for item in my_dictionary:
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' % mydictionary[item]
    doIt(PDF)`

事实上,你真的在​​寻找 File_pencil.pdf(不是 File_055123.pdf)。您正在滑动索引字典而不是其内容。这个论坛主题可能是一个副作用。

于 2015-09-01T16:15:53.037 回答