«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему относительные пути в проектах Python приводят к ошибкам «Файл не найден»?

Почему относительные пути в проектах Python приводят к ошибкам «Файл не найден»?

Опубликовано 7 ноября 2024 г.
Просматривать:605

Why Do Relative Paths in Python Projects Lead to File Not Found Errors?

Доступ к файлам с относительными путями в проектах Python

При работе с файлами в проекте Python для удобства часто используются относительные пути. Однако их поведение может стать неоднозначным, особенно при работе с многоуровневыми структурами проекта.

Рассмотрим следующую структуру проекта:

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

Модуль mod.py пытается прочитать файл в ../data/test.csv, используя относительный путь, но при запуске main.py возникает ошибка, указывающая, что файл не найден. Это очевидное несоответствие связано с тем, что относительный путь определяется по-разному в зависимости от того, где выполняется скрипт.

В случае __init__.py и модуля.py путь оценивается относительно каталога, содержащего эти файлы. файлы. Однако для main.py путь указывается относительно его собственного местоположения.

Устранение неоднозначности пути

Чтобы устранить эту неоднозначность, можно использовать абсолютные пути. В качестве альтернативы, более элегантный подход — использовать атрибут Python __file__:

from pathlib import Path

path = Path(__file__).parent / "../data/test.csv"

with path.open() as f:
    test = list(csv.reader(f))

Этот трюк основан на модуле Python 3.4 pathlib и создает абсолютный путь на основе текущего местоположения скрипта.

Поддержка старых версий Python

Если версии Python ниже 3.4 все еще используются, альтернативный метод предполагает манипулирование текущим путь:

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))

Этот подход объединяет функции os.path для достижения того же результата, что и метод на основе pathlib.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3