How to get rid of double backslash in python windows file path string?

I have a dictionary:

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

I iterate over it:

for item in my_dictionary:
    PDF = r'C:UsersuserDesktopFile_%s.pdf' %item
    doIt(PDF)

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

But I get this error:

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

It can’t find my file. Why does it think there are double backslashes in file path?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The double backslash is not wrong, python represents it way that to the user. In each double backslash \, the first one escapes the second to imply an actual backslash. If a = r'raw string' and b = 'raw s\tring' (no ‘r’ and explicit double slash) then they are both represented as 'raw s\tring'.

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

For clarification, when you print the string, you’d see it as it would get used, like in a path – with just one backslash:

>>> print(a)
raw string
>>> print(b)
raw string

And in this printed string case, the t doesn’t imply a tab, it’s a backslash followed by the letter ‘t’.

Otherwise, a string with no ‘r’ prefix and a single backslash would escape the character after it, making it evaluate the ‘t’ following it == tab:

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

So in the PDF path+name:

>>> item = 'xyz'
>>> PDF = r'C:UsersuserDesktopFile_%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:UsersuserDesktopFile_xyz.pdf

More info about escape sequences in the table here. Also see __str__ vs __repr__.

Method 2

Double backslashes are due to r, raw string:

r'C:UsersuserDesktopFile_%s.pdf' ,

It is used because the might escape some of the characters.

>>> strs = "c:desktopnotebook"

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

>>> strs = r"c:desktopnotebook"  #using r'' escapes the 
>>> print strs

c:desktopnotebook

>>> print repr(strs)   #actual content of strs
'c:\desktop\notebook'

Method 3

It doesn’t. Double backslash is just the way of the computer of saying backslash. Yes, I know this sounds weird, but think of it this way – in order to represent special characters, backslash was chosen as an escaping character (e.g. n means newline, and not the backslash character followed by the n character). But what happens if you actually want to print (or use) a backslash (possibly followed by more characters), but you don’t want the computer to treat it as an escaping character? In that case we escape the backslash itself, meaning we use a double backslash so the computer will understand it’s a single backslash.

It’s done automatically in your case because of the r you added before the string.

Method 4

save yourself from getting a headache you can use other slashes as well.
if you know what I saying. the opposite looking slashes.

you’re using now
PDF = 'C:UsersuserDesktopFile_%s.pdf' %item

try to use
**

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

**
it won’t be treated as a escaping character .

Method 5

alwbtc @
I dare say: “I found the bug…”

replace

PDF = r'C:UsersuserDesktopFile_%s.pdf' %item
doIt(PDF)`

with

for item in my_dictionary:
    PDF = r'C:UsersuserDesktopFile_%s.pdf' % mydictionary[item]
    doIt(PDF)`

in fact you were really looking for File_pencil.pdf (not File_055123.pdf).
You were sliding the index dictionary not its contents.
This forum topic maybe a side-effect.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x