How to get rid of double backslash in python windows file path string?
Solution 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 s\tring'
and b = 'raw s\\tring'
(no 'r' and explicit double slash) then they are both represented as 'raw s\\tring'
.
>>> a = r'raw s\tring'
>>> 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 s\tring
>>> print(b)
raw s\tring
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 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
So in the 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
More info about escape sequences in the table here. Also see __str__
vs __repr__
.
Solution 2
Double backslashes are due to r
, raw string:
r'C:\Users\user\Desktop\File_%s.pdf' ,
It is used because the \
might escape some of the characters.
>>> 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'
Solution 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.
Solution 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:\Users\user\Desktop\File_%s.pdf' %item
try to use **
PDF = 'C:/Users/user/Desktop/File_%s.pdf' %item
** it won't be treated as a escaping character .
alwbtc
Updated on November 21, 2020Comments
-
alwbtc over 3 years
I have a dictionary:
my_dictionary = {"058498":"table", "064165":"pen", "055123":"pencil"}
I iterate over it:
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() )
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?
-
Ashwini Chaudhary almost 12 yearsthere's no
d
:'C:\\Users\\user\\Desktop\\File_055123.pdf'
-
aneroid almost 12 yearsProbably been edited out now.
-
Admin almost 9 yearsIn above example, if you display
strs
like>>> strs
you should getc:\\desktop\\notebook
. print doesnt show the escaped i.e. double slash \\ -
DeeWBee about 8 yearsSorry but this was not a helpful answer. So if double slashes are the case, then how does one fix it????
-
aneroid over 5 years@DeeWBee added some clarification about escape sequences and str vs repr.
-
user2357112 over 5 years@DeeWBee: You don't. There is nothing to fix. It's already fine.
-
Timothy Pulliam over 3 yearsWhy is everyone hardcoding their paths?