Załóżmy, że kod Pythona jest wykonywany w nieznanym wcześniej katalogu Windows, na przykład „main”, a gdziekolwiek kod jest instalowany po uruchomieniu, musi mieć dostęp do katalogu „main / 2091 / data.txt”.
jak używać funkcji open (location)? jaka powinna być lokalizacja?
Edytować :
Okazało się, że poniżej prosty kod będzie działał… czy ma jakieś wady?
file="\2091\sample.txt"
path=os.getcwd()+file
fp=open(path,'r+');
python
file
path
relative-path
Kamelia
źródło
źródło
r"\2091\sample.txt"
. Lub uciekaj im jak"\\2091\\sample.txt"
(ale to jest denerwujące). Ponadto, 2) używasz getcwd (), czyli ścieżki, w której znajdowałeś się podczas wykonywania skryptu. Myślałem, że chcesz w odniesieniu do lokalizacji skryptu (ale teraz się zastanawiam). I 3), zawsze używajos.path
funkcji do manipulowania ścieżkami. Linia łącząca twoją ścieżkę powinna byćos.path.join(os.getcwd(), file)
4) the; nie ma sensuwith open(path, 'r+') as fp:
. Zobacz tutaj, aby uzyskać najlepsze wyjaśnieniewith
stwierdzeń, jakie widziałem.os.path.abspath
umożliwiająca łatwe uzyskanie pełnej ścieżki względnej ścieżki do otwarcia. końcowe oświadczenie wygląda następująco:os.path.abspath('./2091/sample.txt')
Odpowiedzi:
Przy tego typu rzeczach musisz uważać, jaki jest twój rzeczywisty katalog roboczy. Na przykład, nie możesz uruchomić skryptu z katalogu, w którym znajduje się plik. W takim przypadku nie możesz po prostu użyć samej ścieżki względnej.
Jeśli jesteś pewien, że żądany plik znajduje się w podkatalogu poniżej miejsca, w którym faktycznie znajduje się skrypt, możesz tutaj
__file__
pomóc.__file__
to pełna ścieżka do miejsca, w którym znajduje się uruchamiany skrypt.Możesz więc bawić się czymś takim:
źródło
__file__
jest ścieżką względną (przynajmniej w mojej konfiguracji, z jakiegoś powodu) i musiszos.path.abspath(__file__)
najpierw zadzwonić . osx / homebrew 2.7NameError: name '__file__' is not defined
Ten kod działa dobrze:
źródło
Utworzyłem konto tylko po to, by wyjaśnić rozbieżność, którą moim zdaniem znalazłem w oryginalnej odpowiedzi Russa.
Dla porównania, jego pierwotna odpowiedź brzmiała:
To świetna odpowiedź, ponieważ próbuje dynamicznie utworzyć bezwzględną ścieżkę systemową do żądanego pliku.
Cory Mawhorter zauważył, że
__file__
jest to ścieżka względna (jest również w moim systemie) i zasugerował użycieos.path.abspath(__file__)
.os.path.abspath
jednak zwraca bezwzględną ścieżkę do bieżącego skryptu (tj./path/to/dir/foobar.py
)Aby użyć tej metody (i jak ostatecznie ją uruchomiłem), musisz usunąć nazwę skryptu z końca ścieżki:
Wynikowy abs_file_path (w tym przykładzie) staje się:
/path/to/dir/2091/data.txt
źródło
os.path.dirname(os.path.abspath(__file__))
os.path.dirname
funkcjonalności, tak jak to zrobiłem w mojej odpowiedzi w zeszłym roku.To zależy od używanego systemu operacyjnego. Jeśli potrzebujesz rozwiązania, które jest kompatybilne zarówno z Windows, jak i * nix, coś takiego:
powinno działać dobrze.
path
Moduł jest w stanie sformatować ścieżkę niezależnie od systemu operacyjnego jest uruchomiony na. Ponadto Python radzi sobie dobrze ze ścieżkami względnymi, o ile masz odpowiednie uprawnienia.Edycja :
Jak wspomniał kindall w komentarzach, Python i tak może konwertować między ścieżkami w stylu unix i w stylu okien, więc nawet prostszy kod będzie działał:
Mimo to
path
moduł nadal ma kilka przydatnych funkcji.źródło
relpath()
konwertuje nazwę ścieżki na ścieżkę względną. Ponieważ jest to już ścieżka względna, nic nie da.os.path
module jest inna funkcja , która byłaby lepszym wyborem?__file__
. Zobacz moją odpowiedź.Spędziłem dużo czasu, aby odkryć, dlaczego mój kod nie mógł znaleźć mojego pliku z uruchomionym Pythonem 3 w systemie Windows. Więc dodałem. przed / i wszystko działało dobrze:
źródło
file_path = os.path.join(script_dir, 'output03.txt')
script_dir = os.path.abspath(os.path.dirname(__file__))
Kod:
Wyjaśnienie:
Biblioteka importu:
Służy
__file__
do uzyskania ścieżki do aktualnego skryptu:Oddziela ścieżkę skryptu na wiele elementów:
Usuń ostatnią pozycję z listy (rzeczywisty plik skryptu):
Dodaj ścieżkę do pliku względnego:
Połącz elementy listy i dodaj plik ścieżki względnej:
Teraz możesz zrobić, co chcesz z plikiem, na przykład:
źródło
path = "/".join(script_directory) + "/" + rel_path
powinieneś użyć modułu os jak wpath = os.path.join(script_directory, rel_path)
. Zamiast ręcznie analizować ścieżkę, której powinieneś używaćscript_path = os.path.dirname(__file__)
Jeśli plik znajduje się w folderze nadrzędnym, np. follower.txt, możesz po prostu użyć
open('../follower.txt', 'r').read()
źródło
Spróbuj tego:
Python 3.4 wprowadził nową standardową bibliotekę do obsługi plików i ścieżek o nazwie pathlib. Mi to pasuje!
źródło
Nie jestem pewien, czy to działa wszędzie.
Używam ipythona w Ubuntu.
Jeśli chcesz odczytać plik w podkatalogu bieżącego folderu:
twój skrypt znajduje się w bieżącym folderze, po prostu spróbuj tego:
źródło
Python po prostu przekazuje podaną nazwę pliku do systemu operacyjnego, który go otwiera. Jeśli twój system operacyjny obsługuje ścieżki względne, takie jak
main/2091/data.txt
(wskazówka: tak), to zadziała.Może się okazać, że najłatwiejszym sposobem odpowiedzi na takie pytanie jest wypróbowanie go i zobaczenie, co się stanie.
źródło
getcwd()
. Oryginalny opis przeczytałem jako „w stosunku do miejsca, w którym uruchamiam skrypt, niezależnie od tego, gdzie znajduje się kod”.źródło
Kiedy byłem początkującym, uważałem te opisy za nieco onieśmielające. Jak na początku spróbuję
For Windows
a to podniosłoby
syntax error
. Często byłem zdezorientowany. Potem po pewnym surfowaniu po Google. znaleźć przyczynę wystąpienia błędu. Piszę to dla początkującychDzieje się tak, ponieważ w celu odczytania ścieżki w Unicode po prostu dodajesz
\
podczas rozpoczynania ścieżki plikuA teraz działa po prostu dodaj
\
przed uruchomieniem katalogu.źródło
\t
np.\top\directory
„\ T” jest interpretowane jako znak tabulacji, a twoja „sztuczka” kończy się niepowodzeniem. Najlepszą opcją jest użycie nieprzetworzonego formatu łańcucha,r'C:\Users\chidu\Desktop\Skipper New\Special_Note.txt'
który nie próbuje używać znaków „ucieczki”.