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それをユーザーに表現します。各二重円記号\\では、最初の円記号が2番目の円記号をエスケープして、実際の円記号を示します。a = r'raw s\tring'and 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'

明確にするために、文字列を印刷すると、パスのように、バックスラッシュが1つだけ付いた、使用されるのと同じように表示されます。

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

この印刷された文字列の場合、はタブ\tを意味するのではなく、バックスラッシュの後に文字「t」が続きます。\

それ以外の場合、「r」プレフィックスがなく、バックスラッシュが1つある文字列は、その後の文字をエスケープし、その後の「t」を評価します== tab:

>>> 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 文字が続くわけではありません)。しかし、実際にはバックスラッシュ (さらに多くの文字が続く可能性があります) を印刷 (または使用) したいが、コンピュータにそれをエスケープ文字として扱わせたくない場合はどうなるでしょうか? その場合、バックスラッシュ自体をエスケープします。つまり、バックスラッシュを 2 つ使用して、コンピューターがバックスラッシュが 1 つであることを認識できるようにします。

r文字列の前に を追加したため、ケースでは自動的に行われます。

于 2012-08-12T18:39:55.480 に答える
-1

alwbtc @ 私はあえて言う: "私はバグを見つけた..."

交換

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 に答える