Получить путь из открытого файла в Python

113

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

f = open('/Users/Desktop/febROSTER2012.xls')

Откуда fмне получить "/Users/Desktop/febROSTER2012.xls"?

David542
источник

Ответы:

145

Ключевым моментом здесь является nameатрибут fобъекта, представляющего открытый файл. Вы понимаете это так:

>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> f.name
'/Users/Desktop/febROSTER2012.xls'

Помогает?

Tadeck
источник
4
Для файлов, созданных: tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')не работает!
Виктор
19
@Victor: пожалуйста, прочтите документацию tempfileмодуля, особенно для упомянутой вами tempfile.NamedTemporaryFileдокументации tempfile.TemporaryFile. Это особый случай для временного файла, и, как видно из документации, решение уже существует. tempfile.TemporaryFileне предназначен для использования в случае, если вы хотите прочитать имя.
Tadeck
12
Если вы создаете файл с помощью open ('foo.txt', 'w'), а затем выполняете f.name, он предоставляет вам только вывод foo.txt
searchchengine27
Zans предлагает решение, которое работает и для относительных путей. Смотрите его ответ ниже.
Маркус
1
Имейте в виду, что если вы используете относительный путь, например f = open('some/relative/path'), а затем измените рабочий каталог, например os.chdir('somewhere/esle'), то f.nameон не будет обновляться соответствующим образом и не будет иметь смысла в вашем текущем рабочем каталоге.
user986730
96

У меня была такая же проблема. Если вы используете относительный путь, os.path.dirname (path) вернет только относительный путь. os.path.realpath делает свое дело:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)
Zans
источник
15
На самом деле это настоящий ответ.
BlueTrin,
2
Это работает, только если относительный путь к файлу по-прежнему является правильным путем. Если я укажу имя файла как 'text.txt' из каталога '~ / Documents /', а затем изменю каталог на '~ /', os.path.realpathвернет '~ / text.txt' вместо '~ / Documents / text.txt'.
К. Нильсон
1
Я заметил проблему с realpath. Он не исправляет регистр буквенных символов файлов, а сохраняет регистр, используемый в операторе open. Я надеялся, что он вернет имя файла, которое действительно существует в файловой системе. (Это, конечно же, Windows)
RufusVS
12

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

>>> import os
>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> os.path.dirname(f.name)
>>> '/Users/Desktop/'

Таким образом, вы можете получить структуру каталогов.

Али Раза Баяни
источник
Это возвращает пустую строку, если вы используете f = open('febROSTER2012.xls'). Как пройти полный путь?
NZD
3

Вы можете получить это и так.

filepath = os.path.abspath(f.name)
answerSeeker
источник
3
Это добавит его в текущий рабочий каталог, а не в каталог, в котором он фактически находится.
Bachsau