Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange path separators on Windows

I an running this code:

#!/usr/bin/python      coding=utf8
#  test.py = to demo fault
def loadFile(path):
    f = open(path,'r')
    text = f.read()
    return text
if __name__ == '__main__':
    path = 'D:\work\Kindle\srcs\test1.html'
    document = loadFile(path)
    print len(document)

It gives me a trackback

D:\work\Kindle\Tests>python.exe test.py
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    document = loadFile(path)
  File "test.py", line 5, in loadFile
    f = open(path,'r')
IOError: [Errno 22] invalid mode ('r') or filename: 'D:\\work\\Kindle\\srcs\test1.html'

D:\work\Kindle\Tests>

If I change the path line to

path = 'D:\work\Kindle\srcs\\test1.html'

(note the double \\) it all works fine.

Why? Either the separator is '\' or it is not, not a mix?

System. Windows 7, 64bit, Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32

Checked - and all the backslashes appear correctly.

like image 694
Ian Avatar asked Aug 03 '11 15:08

Ian


5 Answers

The backslash is an escape character when the next character combination would result in a special meaning. Take the following examples:

>>> '\r'
'\r'
>>> '\n'
'\n'
>>> '\b'
'\x08'
>>> '\c'
'\\c'
>>>

r, n, and b all have special meanings when preceded by a backslash. The same is true for t, which would produce a tab. You either need to A. Double all your backslashes, for consistency, because '\\' will produce a backslash, or, B, use raw strings: r'c:\path\to\my\file.txt'. The preceding r will prompt the interpreter not to evaluate back slashes as escape sequences, preventing the \t from appearing as a tab.

like image 153
g.d.d.c Avatar answered Oct 21 '22 12:10

g.d.d.c


You need to escape backslashes in paths with an extra backslash... like you've done for '\\test1.html'.

'\t' is the escape sequence for a tab character.

'D:\work\Kindle\srcs\test1.html is essentially 'D:\work\Kindle\srcs est1.html'.

You could also use raw literals, r'\test1.html' expands to:

'\\test1.html'
like image 20
Skurmedel Avatar answered Oct 21 '22 11:10

Skurmedel


Use raw strings for Windows paths:

path = r'D:\work\Kindle\srcs\test1.html'

Otherwise the \t piece of your string will be interpreted as a Tab character.

like image 20
RichieHindle Avatar answered Oct 21 '22 12:10

RichieHindle


The backslash \ is an escape character in Python. So your actual filepath is going to be D:\work\Kindle\srcs<tab>est1.html. Use os.sep, escape the backslashes with \\ or use a raw string by having r'some text'.

like image 1
thegrinner Avatar answered Oct 21 '22 11:10

thegrinner


In addition to using a raw string (prefix string with the r character), the os.path module may be helpful to automatically provide OS-correct slashes when building a pathname.

like image 1
Ross B. Avatar answered Oct 21 '22 12:10

Ross B.