如何从导入文件中获取调用导入文件功能的文件的路径

时间:2019-06-03 03:08:42

标签: python csv package

稍后,我试图简化CSV解析过程,所以我创建了一个小文件,使我可以运行parse_csv.toList('data.csv')并将列表返回到脚本中。 parse_csv.py 导入的文件如下所示:

parse_csv.py

import csv


def toList(file_location_name):
    result_list = []
    with open(file_location_name) as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        for row in csv_reader:
            result_list.append(row)
    return result_list

这是我在试图利用该文件的脚本中调用它的方式:

import-test.py

import parse_csv


print(
    parse_csv.toList('../data.csv')
)

运行 import-test.py 时出现以下错误:

错误

Traceback (most recent call last):
  File "{system path placeholder}\directory-test\import-test.py", line 5, in <module>
    parse_csv.toList('../data.csv')
  File "{system path placeholder}\parse_csv.py", line 6, in toList
    with open(file_location_name) as csv_file:
FileNotFoundError: [Errno 2] No such file or directory: '../data.csv'

我当前的项目目录结构如下

Project
|
|--parse_csv.py
|--data.csv
|--directory-test
   |
   |--import-test.py

我首先想到的是,当我调用open时,'../data.csv'是根据 parse_csv.py 文件而不是预期的 import-test相对引用的.py 文件。

我只是想这样做,以便 parse_csv.py 可以导入到任何地方,并且它将尊重调用文件中的相对文件路径。

如果需要进一步说明,请告诉我。我知道我的措辞在这里可能会令人困惑。

为清楚起见进行编辑:目标是仅调用parse_csv.toList(),并使其接受指向调用它的文件的相对路径的字符串。

2 个答案:

答案 0 :(得分:0)

您可以让您的parse_csv.toList函数接受文件对象而不是文件路径。这样,您打开一个文件,将该文件提供给模块,它将起作用。像这样:

import parse_csv

with open('../data.csv') as csvFile:
    print(parse_csv.toList(csvFile))

或者您可以在调用List之前将相对路径转换为绝对路径。请参阅How to get an absolute file path in Python。只会增加一行。

答案 1 :(得分:0)

import-test.py中,

import os.path
import parse_csv

# to retrieve import-test.py's own absolute path
abs_path = os.path.abspath(__file__)

# its dir_path
dir_path = os.path.dirname(abs_path)

# data.csv's path
csv_path = os.path.join(dir_path, '..', 'data.csv')

# use the path
print(
    parse_csv.toList(csv_path)
)