Отримайте шлях з відкритого файлу в Python


113

Якщо у мене відкритий файл, чи є osзаклик отримати повний шлях у вигляді рядка?

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

Звідки f, як я дістався "/Users/Desktop/febROSTER2012.xls"?

Відповіді:


145

Ключовим тут є nameатрибут fоб’єкта, що представляє відкритий файл. Ви отримуєте це так:

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

Чи допомагає це?


4
Для файлів, створених: tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')не працює!
Віктор

19
@Victor: Будь ласка, прочитайте документацію tempfileмодуля, особливо для tempfile.NamedTemporaryFile, трохи нижче tempfile.TemporaryFileзгаданої вами документації . Це конкретний випадок для тимчасового файлу, і, як видно з документів, вже існує рішення. tempfile.TemporaryFileне призначений для використання в тому випадку, якщо ви хочете прочитати ім'я.
Тадек

12
При створенні файлу з допомогою відкритого ( «foo.txt», «ж») , а потім зробити f.name, він тільки надає вам вихід foo.txt
searchengine27

Zans пропонує рішення, яке також працює для відносних шляхів. Дивіться його відповідь нижче.
Маркус

Існує tempfile.NamedTemporaryFile у випадку, якщо вам потрібно ім'я.
Дані Аполлона

96

У мене було саме таке питання. Якщо ви використовуєте відносний шлях os.path.dirname (шлях) поверне лише відносний шлях. os.path.realpath робить трюк:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)

15
Це насправді реальна відповідь.
BlueTrin

1
Це працює лише в тому випадку, якщо відносний шлях до файлу все ще є правильним шляхом до файлу. Якщо я вкажу ім'я файлу як "text.txt" з каталогу "~ / Documents /", а потім зміню каталоги на "~ /", os.path.realpathповерне "~ / text.txt" замість "~ / Documents / text.txt".
К. Нільсон

1
Я помітив проблему з realpath. Він не виправляє регістр файлів з символами альфа-файлу, а зберігає випадок, що використовується у відкритому операторі. Я сподівався, що воно поверне ім'я файлу, як воно є насправді у файловій системі. (Це, звичайно, 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)

2
Що додало б його до поточного робочого каталогу, а не до каталогу, де воно фактично знаходиться.
Бахсау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.