Предположим, что код python выполняется в неизвестном ранее каталоге Windows, например, «main», и где бы ни был установлен код при его запуске, ему необходимо получить доступ к каталогу «main / 2091 / data.txt».
как мне использовать функцию open (location)? какая должна быть локация?
Редактировать :
Я обнаружил, что приведенный ниже простой код будет работать .. есть ли у него недостатки?
file="\2091\sample.txt"
path=os.getcwd()+file
fp=open(path,'r+');
python
file
path
relative-path
камелия
источник
источник
r"\2091\sample.txt"
. Или уйти от них вроде"\\2091\\sample.txt"
(но это раздражает). Кроме того, 2) вы используете getcwd (), который является путем, по которому вы были при выполнении скрипта. Я думал, что вы хотели относительно местоположения сценария (но теперь мне интересно). И 3) всегда используйтеos.path
функции для управления путями. Линия соединения вашего пути должна бытьos.path.join(os.getcwd(), file)
4); бессмысленноwith open(path, 'r+') as fp:
. Смотрите здесь лучшее объяснениеwith
утверждений, которые я видел.os.path.abspath
позволяющая легко получить полный путь относительного пути, который нужно открыть. последнее утверждение выглядит так:os.path.abspath('./2091/sample.txt')
Ответы:
При работе с такими вещами вам нужно быть осторожным с вашим фактическим рабочим каталогом. Например, вы не можете запускать сценарий из каталога, в котором находится файл. В этом случае вы не можете просто использовать относительный путь сам по себе.
Если вы уверены, что нужный файл находится в подкаталоге ниже того места, где на самом деле находится скрипт, вы можете использовать здесь,
__file__
чтобы помочь вам.__file__
- это полный путь к месту, где находится запускаемый вами скрипт.Итак, вы можете возиться с чем-то вроде этого:
источник
__file__
- это относительный путь (по крайней мере, в моей настройке, по какой-то причине), иos.path.abspath(__file__)
сначала вам нужно позвонить . osx / homebrew 2.7NameError: name '__file__' is not defined
Этот код отлично работает:
источник
Я создал учетную запись только для того, чтобы прояснить несоответствие, которое я обнаружил в исходном ответе Русса.
Для справки, его первоначальный ответ был:
Это отличный ответ, потому что он пытается динамически создать абсолютный системный путь к желаемому файлу.
Кори Мохортер заметил, что
__file__
это относительный путь (он тоже есть в моей системе), и предложил использоватьos.path.abspath(__file__)
.os.path.abspath
однако возвращает абсолютный путь к вашему текущему скрипту (т.е./path/to/dir/foobar.py
)Чтобы использовать этот метод (и то, как я в итоге заставил его работать), вам нужно удалить имя сценария в конце пути:
Результирующий abs_file_path (в этом примере) становится:
/path/to/dir/2091/data.txt
источник
os.path.dirname(os.path.abspath(__file__))
os.path.dirname
функциональность самостоятельно, как я сделал в своем ответе в прошлом году.Это зависит от того, какую операционную систему вы используете. Если вам нужно решение, совместимое как с Windows, так и с * nix, например:
должно работать нормально.
path
Модуль способен форматировать путь для любой операционной системы , он работает на. Кроме того, python отлично обрабатывает относительные пути, если у вас есть правильные разрешения.Редактировать :
Как упоминалось kindall в комментариях, python в любом случае может преобразовывать пути в стиле unix и стиле Windows, поэтому будет работать даже более простой код:
При этом у
path
модуля все еще есть некоторые полезные функции.источник
relpath()
преобразует путь в относительный путь. Поскольку это уже относительный путь, он ничего не сделает.os.path
модуле другая функция, которая была бы лучшим выбором?__file__
. Пожалуйста, посмотрите мой ответ.Я трачу много времени на то, чтобы выяснить, почему мой код не может найти мой файл, работающий на Python 3, в системе Windows. Я добавил. до / и все работало нормально:
источник
file_path = os.path.join(script_dir, 'output03.txt')
script_dir = os.path.abspath(os.path.dirname(__file__))
Код:
Объяснение:
Библиотека импорта:
Используйте
__file__
для получения пути к текущему скрипту:Разделяет путь скрипта на несколько элементов:
Удалите последний элемент в списке (фактический файл сценария):
Добавьте относительный путь к файлу:
Присоединитесь к элементам списка и добавьте файл относительного пути:
Теперь вы можете делать с файлом все, что хотите, например:
источник
path = "/".join(script_directory) + "/" + rel_path
вы должны использовать модуль os, как вpath = os.path.join(script_directory, rel_path)
. Вместо ручного анализа пути, который вы должны использоватьscript_path = os.path.dirname(__file__)
Попробуй это:
Python 3.4 представил новую стандартную библиотеку для работы с файлами и путями, называемую pathlib. Меня устраивает!
источник
Если файл находится в родительской папке, например. follower.txt, вы можете просто использовать
open('../follower.txt', 'r').read()
источник
Не уверен, работает ли это везде.
Я использую ipython в ubuntu.
Если вы хотите прочитать файл в подкаталоге текущей папки:
ваш скрипт находится в текущей папке, просто попробуйте это:
источник
Python просто передает имя файла, которое вы ему даете, операционной системе, которая его открывает. Если ваша операционная система поддерживает относительные пути, такие как
main/2091/data.txt
(подсказка: поддерживает), тогда это будет работать нормально.Вы можете обнаружить, что самый простой способ ответить на такой вопрос - это попробовать и посмотреть, что из этого получится.
источник
getcwd()
. Я читаю исходное описание как «относительно того, где я запускаю сценарий, независимо от того, где находится код».источник
Когда я был новичком, эти описания меня пугали. Как сначала я бы попробовал
For Windows
и это поднимет
syntax error
. Я очень запутался. Затем, после некоторого серфинга в Google. выяснил, почему произошла ошибка. Написание этого для начинающихЭто потому, что для чтения пути в Unicode вы просто добавляете
\
путь к файлу при запускеИ теперь работает просто добавить
\
перед запуском каталог.источник
\t
например\top\directory
, столкнулись с подобным , то '\ t' интерпретируется как символ табуляции, и ваш 'трюк' не срабатывает. Лучшим вариантом является использование формата необработанной строки,r'C:\Users\chidu\Desktop\Skipper New\Special_Note.txt'
который не пытается «экранировать» символы.