Как задать путь к файлу python
Перейти к содержимому

Как задать путь к файлу python

  • автор:

Различия в оставления пути к файлу в Unix и Windows

При доступе к файлу в операционной системе требуется правильно указать путь к файлу. Путь к файлу — это строка, которая представляет местоположение файла.

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

# Unix /path/to/file/text.txt # Windows c:\path\to\file\text.txt

Он разбит на три основные части:

  1. Путь к файлу /path/to/file/ : расположение директории в файловой системе, где папки разделены прямой косой чертой ‘/’ в Unix подобных системах или обратной косой чертой ‘\’ в Windows.
  2. Имя файла text : фактическое имя файла.
  3. Расширение .txt : используется для указания типа файла.

Для чтения или записи в файл нам необходимо его открыть, а для этого нужно передать путь к нужному файлу в качестве строки функции open() . Для Unix подобных систем это делается просто:

>>> full_path = '/path/to/file/text.txt' >>> print(full_path) # /path/to/file/text.txt 

В системе Windows путь включает в себя обратную косую черту ‘\’ . Этот символ в строках на Python используется для экранирования [escape-последовательностей][escape-sequence], таких как новая строка ‘\n’ .

>>> full_path = 'c:\path\to\file\text.txt' >>> print(full_path) # c:\path o # ile ext.txt 

Что бы избежать Windows системах такого безобразия, нам нужно вручную экранировать обратную косую черту ‘\\’ или передавать в функции open() сырую (необработанную) строку, указав перед первой кавычкой строковой литерал ‘r’ :

# экранируем обратную косую черту >>> full_path = 'c:\\path\\to\\file\\text.txt' >>> print(full_path) # c:\path\to\file\text.txt # строковой литерал raw строки >>> full_path = r'c:\path\to\file\text.txt' >>> print(full_path) # c:\path\to\file\text.txt 

А вот как просто создавать и использовать пути при помощи встроенного модуля pathlib . Так как модуль встроенный, то устанавливать ничего не надо.

Строковое представление пути можно посмотреть функцией str() — это сам необработанный путь к файловой системе в собственном виде, например с обратным слешем в Windows, который можно передать любой функции, принимающей путь к файлу в виде строки:

>>> import pathlib # Код запущен на Unix системах >>> path = pathlib.Path('/foo', 'bar', 'baz') >>> path # PosixPath('/foo/bar/baz') >>> str(path) # '/foo/bar/baz' # Код запущен на Windows системе >>> path = pathlib.Path('c:/', 'foo', 'bar') >>> path # WindowsPath('c:/foo/bar') # Строковое представление пути # экранирование происходит автоматически >>> str(path) # 'c:\\foo\\bar' 

Переводить путь в текстовое представление не обязательно, т.к. объект пути модуля pathlib принимают все функции.

Оператор косой черты помогает создавать дочерние пути, аналогично os.path.join():

>>> import pathlib # Сложение путей файловой системы >>> p = pathlib.Path('/etc') >>> p # PosixPath('/etc') >>> p1 = p / 'init.d' / 'apache2' >>> p1 # PosixPath('/etc/init.d/apache2') >>> q = pathlib.Path('bin') >>> q1 = '/usr' / q >>> q1 # PosixPath('/usr/bin') 
# разложение пути >>> p = pathlib.Path('c:/Program Files/PSF') >>> p.parts # ('c:\\', 'Program Files', 'PSF') >>> p.is_dir() # True # определение диска >>> pathlib.Path('c:/Program Files/').drive # 'c:' >>> pathlib.Path('/Program Files/').drive # '' # определение родительской директории >>> p = pathlib.Path('c:/foo/bar/setup.py') >>> p.is_file() # True >>> p.parents[0] # WindowsPath('c:/foo/bar') >>> p.parents[1] # WindowsPath('c:/foo') >>> p.parents[2] # WindowsPath('c:/') # Двигаемся вверх по директории >>> for up in p.parents: . print(up) . # c:\foo\bar # c:\foo # c:\ 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Составление пути к файлу в Unix и Windows
  • Открытие/закрытие файла для чтения/записи
  • Типы обрабатываемых данных и файлов
  • Способы чтения открытого файла
  • Способы записи в открытый файл
  • Одновременное чтение из одного и запись в другой файл
  • Добавление данных в открытый файл
  • Управление указателем чтения/записи в файле
  • Создание менеджера для обработки файла
  • Сохранение словарей в формат JSON
  • Встроенные модули для работы с разными форматами

Пути к файлам

Если передать функции open() простое имя файла, такое как pi_digits.txt, Python ищет файл в том каталоге, в котором находится файл, выполняемый в настоящий момент (то есть файл программы .py).

В некоторых случаях (в зависимости от того, как организованы ваши рабочие файлы) открываемый файл может и не находиться в одном каталоге с файлом программы. Например, файл программы может находиться в каталоге python_work; в каталоге python_work создается другой каталог с именем text_files для текстовых файлов, с которыми работает программа. И хотя папка text_files находится в python_work, простая передача open() имени файла из text_files не подойдет, потому что Python проведет поиск файла в python_work и на этом остановится; поиск не будет продолжен во вложенном каталоге text_files. Чтобы открыть файлы из каталога, отличного от того, в котором хранится файл программы, необходимо указать путь — то есть приказать Python искать файлы в конкретном месте файловой системы.

Так как каталог text_files находится в python_work, для открытия файла из text_files можно воспользоваться относительным путем. Относительный путь приказывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы. В системе Linux и OS X это выглядит так:

with open(‘text_files/имя_файла.txt’) as file_object:

Эта строка означает, что файл .txt следует искать в каталоге text_files; она предполагает, что каталог text_files находится в python_work (так оно и есть). В системах Windows в путях к файлам вместо слеша (/) используется обратный слеш ():

with open(‘text_filesимя_файла.txt’) as file_object:

Также можно точно определить местонахождение файла в вашей системе независимо от того, где хранится выполняемая программа. Такие пути называются абсолютными и используются в том случае, если относительный путь не работает. Например, если каталог text_files находится не в python_work, а в другом каталоге (скажем, в каталоге с именем other_files), то передать open() путь ‘text_files/filename.txt’ не получится, потому что Python будет искать указанный каталог только внутри python_work. Чтобы объяснить Python, где следует искать файл, необходимо записать полный путь.

Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранять в переменных, которые затем передаются open(). В Linux и OS X абсолютные пути выглядят так:

with open(file_path) as file_object:

В Windows они выглядят так:

file_path = ‘C:Usersehmatthesother_files ext_filesимя_файла.txt’

with open(file_path) as file_object:

С абсолютными путями вы сможете читать файлы из любого каталога вашей системы. Пока будет проще хранить файлы в одном каталоге с файлами программ или в каталогах, вложенных в каталог с файлами программ (таких как text_files из рассмотренного примера).

Иногда в системах семейства Windows слеш в пути к файлам интерпретируется правильно. Если вы используете Windows, но не получаете ожидаемых результатов, попробуйте использовать символы обратного слеша.

Относительный путь до файла на Python

Хочу добавить относительный путь в консольную программу на Python. (для возможности портирования на другие ПК). Пишет «No such file or directory». Абсолютный путь работает. Пытался каким-то образом изменить активную директорию, но не смог. »’

def download_fiels(): with open("../wordbooks/russian_nouns.txt", encoding='utf-8') as file: WORD_LIST = [row.strip() for row in file] with open("../wordbooks/russian_pril.txt", encoding='utf-8') as file: QUALITY_LIST = [row.strip() for row in file] with open("../wordbooks/russian_imena.txt", encoding='utf-8') as file: NAME_LIST = [row.strip() for row in file] return WORD_LIST, QUALITY_LIST, NAME_LIST 

Отслеживать

задан 5 мар 2022 в 19:59

23 1 1 серебряный знак 5 5 бронзовых знаков

print(os.getcwd()) для отладки. os.chdir(path) чтобы поменять текущий каталог. Я, правда, chdir не люблю.

Как правильно задать путь к файлу в питоне?

Знаю, что вопрос глупый, но всегда, открывай файл так: cd Desktop и следующей командой шло python3 (имя файла с расширением .py)
начал проходить тему файлов, где можно открывать, как
F = open(‘имя файла с расширением’), на что он мне выдает

Traceback (most recent call last): File "", line 1, in FileNotFoundError: [Errno 2] No such file or directory: 'kl.py'

т.е. нет такого файла.
Вопрос, даже два. 1. Почему нужно постоянно задавать путь к файлу, когда в любом видео-уроке или же книге оно по умолчанию открывает файл без этой ошибки? И 2 вопрос, как правильно задать путь к файлу именно в команде F = open(«») не прибегая к топорному cd?

  • Вопрос задан более трёх лет назад
  • 60061 просмотр

1 комментарий

Простой 1 комментарий

sim3x

А зачем делать open py-файлу?
Решения вопроса 2
senior software developer

как правильно задать путь к файлу именно в команде F = open(«») не прибегая к топорному cd?

как то так

with open(os.path.join('Desktop', 'kl.py')) as f: pass

Ответ написан более трёх лет назад
Нравится 3 5 комментариев
Евгений Колесов @jaimekoyl Автор вопроса

А почему он требует указать путь каждый раз при новой команде? Когда скажем в тех же уроках на ютюбе им это делать не приходиться. Им достаточно написать f = open с именем и расширением и не возникает ошибки.

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

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

Евгений Колесов @jaimekoyl Автор вопроса

Stanislav Pugachev, но опять же я открыл текстовый файл и дал ему расширение .py я почему-то воспринимаю его как текстовый файл, который грубо говоря работает с командами питона и скажем print будет не просто словом в тексте, а командой так ведь? разница ведь только в этом? т.е. файл просто набор текста, а файл с расширением .py модуль который работает с командами питона правильно?

Евгений Колесов,
нене, print будет просто словом в тексте, потому что командой он становится только после интерпретации
а до этого обычный текстовый файл и расширение у него может быть какое угодно
расширение файла например вообще опционально и существует как вспомогательная штука, а не как несущая какой-то технический смысл

Евгений Колесов @jaimekoyl Автор вопроса

Stanislav Pugachev, ну получается файлы с расширением txt мы открываем через file open, а с расширением .py мы импортируем, как import file(кстати пока не понимаю почему открывая терминал эта команда работает, а если в терминале вызвать питон и вписать это же, то он выдает синтаксическую ошибку(если написать import file(имя файла), а если просто указать import file, то он пишет нет имени файл(что в принципе логично), так и должно быть, что он работает в терменале до запуска питона? или тут я тоже допускаю ошибку?)
P.s. лимит комментариев кончился
P.s.s лимит на комменты пошел, а ответ на свой вопрос можно один раз добавлять, так что пишу здесь. Ваши (Stanislav Pugachev Stanislav Pugachev ) решения мне помогли, спасибо большое за терпение и советы!

Ответ написан более трёх лет назад

давайте еще раз по порядку
1) выкидываем книгу лутца
2) открываем https://docs.python.org/2/tutorial/modules.html и читаем первые 2 абзаца
3) дальше используем следующую терминологию
текстовый файл — любой файл с любым рассширением окромя бинарников
питон модуль — файл с инструкциями питона. чаще всего с расширением .py

теперь
мы можем открывать/закрывать/модифицировать текстовые файлы с помощь open().
мы можем импортировать модули из других скриптов (подробнее читаем доки по импортированию)

мы используем импорт для организации более сложных программ
мы используем текстовые файлы (с любым расширением txt, json, xml, html, csv. или вообще без расширения) обычно для хранения/чтения каких-то данных

теперь внимательно:
текст с исходным текстом на питоне (модуль) является частным случаем текстового файла, поэтому в теории вы можете выполнить любые действия с ним как с обычным текстовым файлом
но обычно это имеет смысл в том случае если у вас довольно специфическая задача по кодогенерации
то есть когда вы на лету в вашем же скрипте генерируете программу ( путем написания питон инструкций), сохраняете ее и запускаете программно ( но я сомневаюсь, что это то, что вы сейчас пытаетесь сделать осознанно)

мне ниодного «правильного ответа» не досталось?

Евгений Колесов @jaimekoyl Автор вопроса

Stanislav Pugachev, в комменты нельзя ставить правильный ответ к сожалению, а вчера не смог ответить т.к. лимиты не позволяли писать. Хотел поблагодарить за вчерашние советы, спасибо вам!

Ответы на вопрос 1
Анатолий @trofimovdev
структура

C:\Desktop\project ├── abc.txt ├── main.py ├── folder └── xyz.txt

Указываем абсолютный путь: C:\Desktop\project\abc.txt , C:\Desktop\project\folder\xyz.txt ,
либо
указываем относительный путь: abc.txt , folder\xyz.txt

P.S.: зачем открывать .py файл? Вместо этого можно написать import file 🙂

Ответ написан более трёх лет назад
Нравится 2 5 комментариев
Евгений Колесов @jaimekoyl Автор вопроса

а как работать с файлом тогда? грубо говоря мне нужно построчно его прочитать в интнрпретаторе, но для начала мне ведь нужно открыть в терминале, разве нет? Немного не понял вопрос — зачем его открывать

sindzicat

Евгений Колесов, если вы хотите выполнить инструкции в Python файле, его нужно импортировать, а не открыть и читать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *