我正在创build一个将blob文件存储到硬盘的应用程序,但是这个脚本必须在linux和windows上运行,问题是我想从文件系统根目录给它一个绝对path,而不是相对于项目文件,这是因为即时通讯使用git,而不想处理从同步中排除所有这些文件。
所以我想有这样的东西:
path = '/var/lib/blob_files/' file = open(path+'myfile.blob', 'w')
并在unix中获得一个文件:
/var/lib/blob_files/myfile.blob
并在窗口中:
C:\var\lib\blob_files\myfile.blob
它也可以相对于用户主文件夹(/ home /用户在UNIX和C:/用户/用户在Windows中),但我想这个问题是非常相似的。
我怎么能做到这一点? 有什么图书馆或function可以帮助我透明地转换这个path,而不必问什么平台是一直运行的脚本?
我的两个选项,绝对从根目录或相对于主文件夹,您build议使用哪一个?
在此先感谢您的任何意见
对于与用户主目录相关的文件,使用os.path.abspath()
和os.path.expanduser()
:
print os.path.abspath("/var/lib/blob_files/myfile.blob") >>> C:\var\lib\blob_files\myfile.blob print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob")) >>> C:\Users\jerry\blob_files\myfile.blob
这些将为Windows和POSIX路径“做正确的事情”。
如果没有~
的话, expanduser()
不会改变路径,所以你可以安全的使用它。 因此,您可以轻松编写一个包装函数:
import os def fixpath(path): return os.path.abspath(os.path.expanduser(path))
请注意,所使用的驱动器号将是Python进程当前工作目录(通常是脚本所在的目录)(如果从Windows资源管理器启动,并且假设您的脚本没有更改它)指定的驱动器。 如果你想强迫它总是C:
你可以做这样的事情:
import os def fixpath(path): path = os.path.normpath(os.path.expanduser(path)) if path.startswith("\\"): return "C:" + path return path
从混合平台无关的文件路径响应?
>>> import os >>> os.path.join('app', 'subdir', 'dir', 'filename.foo') 'app/subdir/dir/filename.foo'