109

在 python 中,我有变量base_dirfilename. 我想将它们连接起来以获得fullpath. 但是在 windows 下我应该使用\and 用于 POSIX /

fullpath = "%s/%s" % ( base_dir, filename ) # for Linux

我怎样才能使这个平台独立?

4

6 回答 6

183

您想为此使用os.path.join()

使用它而不是字符串连接等的优势在于它知道各种操作系统特定的问题,例如路径分隔符。例子:

import os

Windows 7下:

base_dir = r'c:\bla\bing'
filename = r'data.txt'

os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'

Linux下:

base_dir = '/bla/bing'
filename = 'data.txt'

os.path.join(base_dir, filename)
'/bla/bing/data.txt'

os模块包含许多用于目录、路径操作和查找操作系统特定信息的有用方法,例如通过os.sep在路径中使用的分隔符

于 2012-06-06T16:57:40.440 回答
26

使用os.path.join()

import os
fullpath = os.path.join(base_dir, filename)

os.path模块包含平台无关路径操作所需的所有方法,但如果您需要知道当前平台上的路径分隔符是什么,您可以使用os.sep.

于 2012-06-06T16:58:07.747 回答
17

在这里挖掘一个老问题,但在 Python 3.4+ 上,您可以使用pathlib 运算符

from pathlib import Path

# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"

os.path.join()与您有幸运行最新版本的 Python相比,它可能更具可读性。但是,如果您必须在僵化或遗留环境中运行代码,您也需要权衡与旧版本 Python 的兼容性。

于 2017-03-14T05:22:02.417 回答
9
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.
于 2012-06-06T17:01:10.483 回答
1

我为此制作了一个助手类:

import os

class u(str):
    """
        Class to deal with urls concat.
    """
    def __init__(self, url):
        self.url = str(url)

    def __add__(self, other):
        if isinstance(other, u):
            return u(os.path.join(self.url, other.url))
        else:
            return u(os.path.join(self.url, other))

    def __unicode__(self):
        return self.url

    def __repr__(self):
        return self.url

用法是:

    a = u("http://some/path")
    b = a + "and/some/another/path" # http://some/path/and/some/another/path
于 2014-11-25T19:21:30.220 回答
0

谢谢你。对于使用 fbs 或 pyinstaller 和冻结应用程序看到此内容的任何其他人。

我可以使用以下现在完美的方法。

target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")

我之前正在做这种笨拙的事情,这显然不理想。

if platform == 'Windows':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")

if platform == 'Linux' or 'MAC':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + "sqlite_example.db")

target_db_path = target_db
print(target_db_path)
于 2020-06-12T14:05:23.577 回答