假设我有一个python项目,其 struct 如下:

project
    /data
        test.csv
    /package
        __init__.py
        module.py
    main.py

__init__.py:

from .module import test

module.py:

import csv

with open("..data/test.csv") as f:
    test = [line for line in csv.reader(f)]

main.py:

import package

print(package.test)

当我运行main.py时,会出现以下错误:

 C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import package
  File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module>
    from .module import test
  File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
    with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'

但是,如果从package目录运行module.py,则不会出现错误.因此,open(...)中使用的相对路径似乎只与原始文件的运行位置有关(即__name__ == "__main__")?我不想使用绝对路径.有什么方法可以解决这个问题?

推荐答案

相对路径是相对于current working directory的.

但从当前脚本构建绝对路径有一个常用技巧:使用其__file__特殊属性:

from pathlib import Path

path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
    test = list(csv.reader(f))

这需要Python3.4+(对于pathlib模块).

如果您仍然需要支持旧版本,您可以通过以下方式获得相同的结果:

import csv
import os.path

my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
    test = list(csv.reader(f))

[100 python3.4+ should now be the norm, so I moved the pathlib version inspired by jpyams' comment first]

Python-3.x相关问答推荐

Paramiko SFTPClient get()和put()函数的通过/失败结果?

当我在正则表达式末尾使用斜杠时,为什么会得到不同的结果?

如何使用python将pdf文件的页面合并为单个垂直组合页面

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

从 LeetCode 的 Python 解决方案类中理解关键字 self

将水平堆叠的数据排列成垂直

Pandas groupby 然后 for each 组添加新行

转换Pandas 数据框 - 添加行

有没有一种方法可以通过输入从 0 到 255 的 R、G 和 B 值来生成 RGB colored颜色 ,而无需使用 python 中的 matplotlib 模块?

Python:如何在Pandas 的 .agg 函数中使用 value_counts()?

为直方图中的每个 bin 绘制不同的 colored颜色 (Matplotlib)

在气流中运行 DAG 时出现处理信号:ttou消息

UnicodeDecodeError:utf-8编解码器无法解码位置 1 的字节 0x8b:无效的起始字节,同时读取Pandas中的 csv 文件

简单的 get/post 请求在 python 3 中被阻止,但在 python 2 中没有

'~'(波浪号)运算符在 Python 中的应用

python 3.4版不支持'ur'前缀

为什么`multiprocessing.Queue.get`这么慢?

定义 True,如果没有定义,会导致语法错误

在 linux mint 上安装 python3-venv 模块

将 Python SIGINT 重置为默认信号处理程序