如何使用pathlib规范化相对路径

12

我想在Python中使用相对路径,并将我的CSV文件放在与Python代码不同的文件夹中。

我的Python程序位于以下文件夹中:

G:\projects\code
我想读取这个文件,它在上一级目录中:

我想读取这个文件,它在上一级目录中:

G:\projects\data\sales.csv

如何使用 pathlib 指定一个比当前工作目录上一级的路径?我不想改变当前工作目录。

我尝试过这个:

from pathlib import Path
file = Path.cwd() /'..'/'data'/'sales.csv'

但现在 'file' 变量的值为:

'G:/projects/code/../data/sales.csv'
我仔细阅读了文档,但要么没有解释,要么我没看懂。

docs


3
有问题吗?路径应该还是正确的。 - JohnO
如果你想从不同的文件夹运行,请使用__file__而不是Path.cwd() - Mad Physicist
5个回答

14

虽然路径中包含'..'不是问题(您仍然可以使用此路径以在Python中打开文件等),但您可以使用resolve()来规范化路径:

from pathlib import Path
path = Path.cwd() / '..' / 'data' / 'sales.csv'
print(path)  # WindowsPath('G:/projects/code/../data/sales.csv')
print(path.resolve())  # WindowsPath('G:/projects/data/sales.csv')

NB: 我个人更愿意将包含路径的变量命名为path,而不是file。这样您以后就可以执行file = open(path)


2
print(
    Path(__file__).parent,  # the folder
    Path(__file__).parent.parent,  # the folder's parent
    sep='\n'
)

print(
    Path(
        Path(__file__).parent.parent, 'hello.py'
    )
)

导致
C:\Users\isik\Desktop\Python\MessAround\project\module
C:\Users\isik\Desktop\Python\MessAround\project
C:\Users\isik\Desktop\Python\MessAround\project\hello.py

有了这个文件结构

-project
    -module
        -__init__.py
    -hello.py
    -__init__.py

当代码位于project.module.__init__.py内部时


0

这篇文章很老了,但我在寻找其他东西时偶然发现了它。

奇怪的是你从来没有得到一个直接、明显的答案——你需要使用parent属性:

from pathlib import Path
file = Path.cwd().parent / 'data' / 'sales.csv'

请注意,一些回答认为你需要__file__而不是当前工作目录可能是正确的(根据您的用例),在这种情况下,它应该是:
from pathlib import Path
file = Path(__file__).parent.parent / 'data' / 'sales.csv'

Python文件的父目录是代码目录,其父目录是项目目录。

然而,按照相对路径引用数据并不是一个好的实践方法--我认为使用当前工作目录是更好的选择--但你应该通过sys.argv将数据路径传递给脚本。


0

这是我使用的一个例子:

import json
from pathlib import Path

def read_files(folder_name, file_name):
    base_path = Path.cwd().joinpath('configs','resources')
    path = base_path.joinpath(folder_name,file_name)
    open_file = open(path,'r')
    return json.load(open_file.read())

0
你的意思是“读取我的csv文件”吗?
在Python中,import关键字有不同的含义(你只能导入其他Python模块)。
无论如何,为了读取位于Python文件上一级文件夹中的文件,你可以使用以下代码:
import os
filePath = os.path.dirname(__file__)+'/../'+fileName
fileDesc = open(filePath)
fileData = fileDesc.read()
fileDesc.close()
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接