Reputation: 3822
Suppose I need to refer to the path C:\meshes\as
. If I try writing that directly, like "C:\meshes\as"
, I encounter problems - either some exception, or the path just doesn't work. Is this because \
is acting as an escape character? How should I write the paths?
Upvotes: 302
Views: 777694
Reputation: 80378
Use Path
:
from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
print(file_to_open.read_text())
Path
takes a path-like string and adjusts everything for the current OS, either Windows or Linux. For example, on Linux it would convert all backslashes to forward slashes, and on Windows it would do the reverse.
Full article: Python 3 Quick Tip: The easy way to deal with file paths on Windows, Mac and Linux
My experience:
os.path.join(...)
, then switched to normpath(...)
then finally switched to Path(...)
. Having used all three, Path is the best of all worlds.Advantages of Path over os.path.join(...)
:
/
(see above).Advantages of Path over normpath(...)
:
/
rather than having to fall back to os.path.join(...)
, with nested normpath calls to fix things up.Upvotes: 22
Reputation: 85683
You can use always:
'C:/mydir'
This works both in Linux and Windows.
Another possibility is:
'C:\\mydir'
If you have problems with some names you can also try raw string literals:
r'C:\mydir'
However, the best practice is to use the os.path
module functions that always joins with the correct path separator (os.path.sep
) for your OS:
os.path.join(mydir, myfile)
From python 3.4 you can also use the pathlib
module. This is equivalent to the above:
pathlib.Path(mydir, myfile)
or:
pathlib.Path(mydir) / myfile
Upvotes: 435
Reputation: 807
Python raw string is created by prefixing a string literal with ‘r’ or ‘R’. Python raw string treats backslash () as a literal character. This is useful when we want to have a string that contains backslash and don’t want it to be treated as an escape character.
Doing Manually Such as:
WindowsPath("C:\meshes\as")
or by using r or R:
WindowsPath(r'C:/meshes/as')
Upvotes: 8
Reputation: 392010
Use the os.path
module.
os.path.join( "C:", "meshes", "as" )
Or use raw strings
r"C:\meshes\as"
I would also recommend no spaces in the path or file names. And you could use double backslashes in your strings.
"C:\\meshes\\as.jpg"
Upvotes: 46
Reputation: 46593
Yes, \
in Python string literals denotes the start of an escape sequence. In your path you have a valid two-character escape sequence \a
, which is collapsed into one character that is ASCII Bell:
>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess
Other common escape sequences include \t
(tab), \n
(line feed), \r
(carriage return):
>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']
As you can see, in all these examples the backslash and the next character in the literal were grouped together to form a single character in the final string. The full list of Python's escape sequences is here.
There are a variety of ways to deal with that:
Python will not process escape sequences in string literals prefixed with r
or R
:
>>> r'C:\meshes\as'
'C:\\meshes\\as'
>>> print(r'C:\meshes\as')
C:\meshes\as
Python on Windows should handle forward slashes, too.
You could use os.path.join
...
>>> import os
>>> os.path.join('C:', os.sep, 'meshes', 'as')
'C:\\meshes\\as'
... or the newer pathlib
module
>>> from pathlib import Path
>>> Path('C:', '/', 'meshes', 'as')
WindowsPath('C:/meshes/as')
Upvotes: 39