Uzyskaj ścieżkę z otwartego pliku w Pythonie

113

Jeśli mam otwarty plik, czy istnieje oswezwanie do uzyskania pełnej ścieżki w postaci ciągu?

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

Od f, jak mam dostać "/Users/Desktop/febROSTER2012.xls"?

David542
źródło

Odpowiedzi:

145

Kluczem jest tutaj nameatrybut fobiektu reprezentującego otwarty plik. Otrzymujesz to w ten sposób:

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

Czy to pomaga?

Tadeck
źródło
4
W przypadku plików utworzonych przez: tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')nie działa!
Victor,
19
@Victor: Przeczytaj dokumentację tempfilemodułu, zwłaszcza dla tempfile.NamedTemporaryFile, tuż poniżej wspomnianej dokumentacji tempfile.TemporaryFile. Jest to specyficzny przypadek dla pliku tymczasowego i, jak widać w dokumentacji, istnieje już rozwiązanie. tempfile.TemporaryFilenie jest przeznaczone do użycia w przypadku, gdy chcesz odczytać nazwę.
Tadeck
12
Jeśli utworzysz plik za pomocą open ('foo.txt', 'w'), a następnie zrobisz f.name, dostarczy on tylko dane wyjściowe foo.txt
searchchengine 27
Zans daje rozwiązanie, które działa również dla ścieżek względnych. Zobacz jego odpowiedź poniżej.
Markus
1
Pamiętaj, że jeśli użyjesz względnej ścieżki, takiej jak f = open('some/relative/path'), a następnie zmienisz katalog roboczy, na przykład os.chdir('somewhere/esle'), f.namenie zaktualizuje się odpowiednio i nie będzie miało sensu w twoim bieżącym katalogu roboczym.
user986730
96

Miałem dokładnie ten sam problem. Jeśli używasz ścieżki względnej, os.path.dirname (ścieżka) zwróci tylko ścieżkę względną. os.path.realpath załatwia sprawę :

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)
Zans
źródło
15
To jest faktycznie prawdziwa odpowiedź.
BlueTrin
2
Działa to tylko wtedy, gdy względna ścieżka pliku jest nadal poprawną ścieżką do pliku. Jeśli określę nazwę pliku jako „text.txt” z katalogu „~ / Documents /”, a następnie zmienię katalogi na „~ /”, os.path.realpathzwróci „~ / text.txt” zamiast „~ / Documents / text.txt”.
K. Nielson
1
Zauważyłem problem z realpath. Nie koryguje wielkości liter w plikach, ale raczej zachowuje wielkość liter użytą w instrukcji open. Miałem nadzieję, że zwróci nazwę pliku, która faktycznie istnieje w systemie plików. (To jest oczywiście Windows)
RufusVS
12

A jeśli chcesz tylko uzyskać nazwę katalogu i nie potrzebujesz dołączonej do niego nazwy pliku, możesz to zrobić w następujący konwencjonalny sposób za pomocą osmodułu Python.

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

W ten sposób możesz przejąć strukturę katalogów.

Ali Raza Bhayani
źródło
Zwraca pusty ciąg, jeśli używasz f = open('febROSTER2012.xls'). Jak dotrzeć do pełnej ścieżki?
NZD
3

Możesz to również uzyskać w ten sposób.

filepath = os.path.abspath(f.name)
odpowiedźSeeker
źródło
3
Który dołączyłby go do bieżącego katalogu roboczego, a nie do katalogu, w którym faktycznie się znajduje.
Bachsau,