Как получить путь к файлу, вызывающему функцию импортированного файла, из импортированного файла - PullRequest
0 голосов
/ 03 июня 2019

В дальнейшем я пытаюсь немного упростить мне анализ 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 :

Error

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 голосов
/ 03 июня 2019

В 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)
)
0 голосов
/ 03 июня 2019

Вы можете сделать так, чтобы ваша функция parse_csv.toList принимала файловый объект вместо пути к файлу.Таким образом, вы открываете файл, даете его модулю, и он будет работать.Что-то вроде:

import parse_csv

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

Или вы можете преобразовать относительный путь в абсолютный путь перед вызовом toList.См. Как получить абсолютный путь к файлу в Python .Это просто добавит еще одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...