Файл не найден, хотя файл не существует

Я пытаюсь прочитать файл, используя функцию with open() из python. Я передаю путь к файлу через базовый путь, а затем добавляю к нему относительный путь:

filepath = base_path + path_to_specific_file

with open (filepath) as l:
    do_stuff()

base_path использует домашний символ linux (я использую Ubuntu на виртуальной машине) ~/base_path/, так как я хочу, чтобы путь к файлу был адаптирован для каждого устройства, а не жестко кодировался.

Это не работает. Когда я выполняю код, он выдает ошибку «файл не найден», хотя путь существует. Я даже могу открыть его, щелкнув путь в терминале vscode.

Согласно этой теме:

Файл не найден в Python, хотя файл существует

проблема в ~/ вместо /home/username/. Есть ли способ заменить это, чтобы оно работало на каждом устройстве с правильным путем? Я пока не могу комментировать эту тему, так как у меня недостаточно репутации, поэтому мне нужно было создать этот новый вопрос. Извини за это.

Не объединяйте пути к файлам с помощью +, так как иногда это может пойти не так. используйте pathlib.Path и создайте путь к файлу. Вы можете получить от него absolute_path(), который разрешит такие формы.

Kris 17.03.2022 12:42

~ — это ярлык оболочки. использовать path.home()

stark 17.03.2022 12:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете присоединиться к путям, например. с:

filepath = '/'.join((basepath, path_to_specific_file))

Или сделайте, как предложил Крис: используйте pathlib:

>>> basepath = Path('/tmp/')
>>> path_to_specific_file = Path('test')
>>> filepath = basepath / path_to_specific_file
>>> print(filepath)
/tmp/test

Обновлено:

Чтобы получить доступ к $HOME (~), вы можете использовать Path.home().

Это не будет работать для коротких путей, таких как ~.

Kris 17.03.2022 13:00
Ответ принят как подходящий

Вы можете использовать expanduser() из pathlib для этого. Пример

import pathlib
filepath = pathlib.Path(base_path) / path_to_specific_file
filepath = filepath.expanduser() # expand ~

with open(filepath) as l:
    do_stuff()

Это должно работать нормально.

Другие вопросы по теме