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 tex开发者_Python百科t
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.
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.
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'
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.
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'
.
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.
Gotcha — backslashes in Windows filenames provides an interesting overview.
精彩评论