web-dev-qa-db-ja.com

python Windowsファイルパス文字列で二重バックスラッシュを取り除く方法は?

辞書があります:

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'

ファイルが見つかりません。ファイルパスに二重のバックスラッシュがあると考えるのはなぜですか?

22
alwbtc

二重バックスラッシュは間違っていません、pythonrepresentsそれはユーザーにとってそれです。各二重バックスラッシュ\\では、最初のものescapes実際のバックスラッシュを意味する2番目。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すると、パスのように、バックスラッシュが1つだけ使用されているように表示されます。

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

そして、この印刷された文字列の場合、\ttabを意味せず、バックスラッシュ\とそれに続く文字 't'です。

それ以外の場合、「r」プレフィックスなしの文字列と単一のバックスラッシュは、文字afterをエスケープし、それに続く「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 path + name:

>>> 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__ も参照してください。

14
aneroid

二重バックスラッシュは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'
10

頭痛を避けるために、他のスラッシュも使用できます。あなたが私が言っていることを知っていれば。逆向きのスラッシュ。

あなたは今使用していますPDF = 'C:\Users\user\Desktop\File_%s.pdf' %item

使用してみてください**

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

**エスケープキャラクターとしては扱われません。

3
Abdul

そうではありません。二重バックスラッシュは、コンピュータがバックスラッシュを言う方法にすぎません。はい、これは奇妙に聞こえますが、このように考えてください-特殊文字を表すために、エスケープ文字としてバックスラッシュが選択されました(たとえば、\ nは改行であり、バックスラッシュ文字の後にn文字が続くことを意味します)。しかし、実際にバックスラッシュを印刷(または使用)したい(その後にさらに文字が続く)場合はどうなるでしょうが、コンピューターにエスケープ文字として扱わせたくない場合はどうでしょうか。その場合、バックスラッシュ自体をエスケープします。つまり、ダブルバックスラッシュを使用するため、コンピューターはそれが単一のバックスラッシュであることを認識します。

文字列の前にrを追加したため、この場合は自動的に行われます。

3
Eran Zimmerman