问题
Given a path such as \"mydir/myfile.txt\"
, how do I find the file\'s absolute path relative to the current working directory in Python? E.g. on Windows, I might end up with:
\"C:/example/cwd/mydir/myfile.txt\"
回答1:
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Also works if it is already an absolute path:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
回答2:
You could use the new Python 3.4 library pathlib
. (You can also get it for Python 2.6 or 2.7 using pip install pathlib
.) The authors wrote: "The aim of this library is to provide a simple hierarchy of classes to handle filesystem paths and the common operations users do over them."
To get an absolute path in Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Or on UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Docs are here: https://docs.python.org/3/library/pathlib.html
回答3:
>>> import os
>>> os.path.abspath('mydir/myfile.txt')
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
回答4:
Better still, install the module (found on PyPI), it wraps all the os.path
functions and other related functions into methods on an object that can be used wherever strings are used:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
回答5:
Today you can also use the unipath
package which was based on path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
I would recommend using this package as it offers a clean interface to common os.path utilities.
回答6:
Update for Python 3.4+ pathlib that actually answers the question:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
If you only need a temporary string, keep in mind that you can use Path
objects with all the relevant functions in os.path, including of course abspath:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
回答7:
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Note that expanduser
is necessary (on Unix) in case the given expression for the file (or directory) name and location may contain a leading ~/
(the tilde refers to the user's home directory), and expandvars
takes care of any other environment variables (like $HOME
).
回答8:
Module os
provides a way to find abs path.
BUT most of the paths in Linux start with ~
(tilde), which doesn't give a satisfactory result.
so you can use srblib
for that.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
install it using python3 -m pip install srblib
https://pypi.org/project/srblib/
回答9:
This always gets the right filename of the current script, even when it is called from within another script. It is especially useful when using subprocess
.
import sys,os
filename = sys.argv[0]
from there, you can get the script's full path with:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
It also makes easier to navigate folders by just appending /..
as many times as you want to go 'up' in the directories' hierarchy.
To get the cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
For the parent path:
>>> os.path.abspath(filename+"/../..")
'/foo'
By combining "/.."
with other filenames, you can access any file in the system.
回答10:
I prefer to use glob
here is how to list all file types in your current folder:
import glob
for x in glob.glob():
print(x)
here is how to list all (for example) .txt files in your current folder:
import glob
for x in glob.glob('*.txt'):
print(x)
here is how to list all file types in a chose directory:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
hope this helped you
回答11:
if you are on a mac
import os
upload_folder = os.path.abspath("static/img/users")
this will give you a full path:
print(upload_folder)
will show the following path:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
回答12:
In case someone is using python and linux and looking for full path to file:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
回答13:
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"
filenameWithPath = os.path.join(filePathWithSlash, filename)
来源:https://stackoverflow.com/questions/51520/how-to-get-an-absolute-file-path-in-python