Soru Dosyayı Python'da göreli bir konumda açın


Python kodunun, 'main' (öntanımlı) dizini tarafından bilinmediği, ve çalıştırıldığında kodun kurulduğu her yerde 'main / 2091 / data.txt' dizinine erişmesi gerektiğine varsayalım.

açık (konum) işlevini nasıl kullanmalıyım? konum ne olmalı?

Düzenle :

Basit kodun altında çalışacağını öğrendim .. herhangi bir dezavantajı var mı?

    file="\2091\sample.txt"
    path=os.getcwd()+file
    fp=open(path,'r+');

80
2017-08-23 18:24


Menşei


Çıkışsız backslashes kullanıyorsunuz. Bu bir dezavantaj. - orip
Çeşitli dezavantajlar. 1) @orip başına, pencerelerde bile yollar için eğik çizgi kullanın. Dizenin işe yaramayacak. Ya da gibi ham dizeleri kullanın r"\2091\sample.txt". Ya da onlardan kaçmak gibi "\\2091\\sample.txt" (ama bu sinir bozucu). Ayrıca, 2) sen betiği çalıştırdığınızda bulunduğunuz yol olan getcwd () kullanıyorsunuz. Senaryo konumuna göre istediğini sanıyordum (ama şimdi merak ediyorum). Ve 3), her zaman kullanın os.path yolları manipüle etmek için fonksiyonlar. Yol birleştirme hattınız olmalı os.path.join(os.getcwd(), file) 4); anlamsız - Russ
Ve iyi bir ölçü için ... 5) içeriği korumak için bağlam muhafızlarını kullanın ve dosyanızı kapatmayı unutmadan kaçının: with open(path, 'r+') as fp:. Görmek İşte en iyi açıklaması için with gördüğüm ifadeler. - Russ
Benzer soru: stackoverflow.com/questions/51520/... - Raj


Cevaplar:


Bu tür bir şeyle, gerçek çalışma rehberinizin ne olduğuna dikkat etmeniz gerekir. Örneğin, betiği, dosyanın bulunduğu dizinden çalıştırmayabilirsiniz. Bu durumda, kendi başına göreli bir yol kullanamazsınız.

İstediğiniz dosyanın, betiğin bulunduğu yerin altında bir alt dizin olduğundan eminseniz, kullanabilirsiniz. __file__ Burada size yardımcı olmak için. __file__ Çalışmakta olduğunuz komut dosyasının bulunduğu tam yoldur.

Yani böyle bir şeyle keman yapabilirsiniz:

import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

116
2017-08-23 18:59



Basit kodun altında çalışacağını öğrendim .. herhangi bir dezavantajı var mı? <pre> file = "\ sample.txt" yol = os.getcwd () + str (loc) + dosya fp = açık (yol, 'r +'); <code>
@Arash Bunun dezavantajı, cwd (geçerli çalışma dizini) bir şey olabilir ve mutlaka komut dosyanızın bulunduğu yer olmayabilir. - Cory Mawhorter
__file__ göreceli bir yoldur (en azından kurulumumda, nedense) ve aramanız gerekir os.path.abspath(__file__) ilk. osx / homebrew 2.7 - Cory Mawhorter
os.path.dirname (dosya) Python 2.7'de benim için çalışmıyor. Gösteriyor NameError: name '__file__' is not defined - Soumendra


Bu kod iyi çalışıyor:

import os


def readFile(filename):
    filehandle = open(filename)
    print filehandle.read()
    filehandle.close()



fileDir = os.path.dirname(os.path.realpath('__file__'))
print fileDir

#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)

#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, 'Folder1.1/same.txt')
readFile(filename)

#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, '../same.txt')
readFile(filename)

#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, '../Folder2/same.txt')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)

24
2017-10-06 15:06





Sadece bir hesap oluşturdum, bu yüzden Russ'ın orijinal yanıtında bulduğum bir çelişkiyi netleştirebildim.

Referans olarak, orijinal cevabı:

import os
script_dir = os.path.dirname(__file__)
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

Bu harika bir cevap çünkü dinamik olarak istenen dosyaya mutlak bir sistem yolu oluşturmaya çalışıyor.

Cory Mawhorter bunu fark etti. __file__ göreli bir yoldur (sistemimde de öyle) ve önerilen os.path.abspath(__file__). os.path.abspathAncak, geçerli komut dosyanızın mutlak yolunu döndürür (ör. /path/to/dir/foobar.py)

Bu yöntemi kullanmak için (ve sonunda nasıl çalıştığını), komut dosyasının adını yolun sonundan kaldırmanız gerekir:

import os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

Elde edilen abs_file_path (bu örnekte): /path/to/dir/2091/data.txt


14
2017-09-01 20:54



Daha basit olan için her iki yaklaşımı bile birleştirebilirsiniz. os.path.dirname(os.path.abspath(__file__)) - Luke Taylor
@LukeTaylor Gerçekten de çoğaltmaya çalışmaktan daha iyi olurdu. os.path.dirname Geçen yıl cevaplarımda yaptığım gibi kendinize işlevsellik. - Grant Hulegaard


Hangi işletim sistemini kullandığınıza bağlıdır. Hem Windows hem de * nix ile uyumlu bir çözüm istiyorsanız:

from os import path

file_path = path.relpath("2091/data.txt")
with open(file_path) as f:
    <do stuff>

iyi çalışmalı.

path modül, üzerinde çalıştığı herhangi bir işletim sistemi için bir yolu biçimlendirebilir. Ayrıca, doğru izinlere sahip olduğunuz sürece python göreceli yolları iyi işleyebilir.

Düzenle:

Yorumlarda kindall'ın belirttiği gibi, python unix stili ve windows stili yollar arasında dönüştürebilir, böylece daha basit kodlar çalışır:

with open("2091/data/txt") as f:
    <do stuff>

Söyleniyor ki path modül hala bazı yararlı işlevleri vardır.


11
2017-08-23 18:30



relpath() bir yol adını göreceli bir yola dönüştürür. Zaten göreceli bir yol olduğu için hiçbir şey yapmayacak. - kindall
Uygunsa, unix tarzı bir yoldan pencere stili yoluna dönüştürür. İçinde başka bir işlev var mı os.path modül daha iyi bir seçim olur mu? - Wilduck
Windows zaten UNIX tarzı bir yol ile iyi çalışacaktır. En azından NT tabanlı dizi (2000, XP, Vista, 7) olacaktır. Dönüşüm gerekli değil. - kindall
Sen haklısın Düzenlenen. - Wilduck
Bu cevap doğru değildir ve sorunlara neden olur. Göreli yollar, geçerli çalışma dizinine göre varsayılan olarak (komut dosyasının yürütüldüğü yol) ve gerçek komut dosyasının konumu DEĞİLDİR. Kullanmalısın __file__. Lütfen cevabımı gör. - Russ


Bu her yerde çalışırsa emin değilim.

Ubuntu'da ipython kullanıyorum.

Geçerli klasörün alt dizininde dosya okumak isterseniz:

/current-folder/sub-directory/data.csv

komut dosyanız mevcut klasörde sadece şunu deneyin:

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)

1
2017-08-21 02:20





Dosya ana klasörünüzdeyse, örn. follower.txt, sadece kullanabilirsiniz open('../follower.txt', 'r').read()


1
2017-12-30 15:04





Python, verdiğiniz dosya adını sadece onu açan işletim sistemine geçirir. İşletim sisteminiz benzeri göreli yolları destekliyorsa main/2091/data.txt (ipucu: yapar), o zaman iyi çalışır.

Böyle bir soruyu cevaplamanın en kolay yolunun bunu denemek ve ne olduğunu görmek olduğunu görebilirsiniz.


0
2017-08-23 18:31



Doğru değil ... komut dosyasının içindeki çalışma dizini, komut dosyasını çalıştırdığınız konumdur. değil komut dosyasının konumu. Komut dosyasını başka bir yerden çalıştırırsanız (belki de komut dosyası sistem yolundadır) alt dizinin göreli yolu çalışmaz. Bu konuda nasıl cevap alacağımı görmek için lütfen cevabımı inceleyin. - Russ
@Russ - OP'nin kullandığı örnek getcwd(). Orijinal açıklamayı "kodun nerede oturduğuna bakılmaksızın komut dosyasını çalıştırdığım yere göre" olarak okudum. - orip
@orip - OP, sorudan 3 saat sonra getcwd () çağrısını ekledi. Olursa olsun ... devam ediyor. :) - Russ
@Russ - görüyorum ... - orip


Bunu dene:

from pathlib import Path

data_folder = Path("/relative/path")
file_to_open = data_folder / "file.pdf"

f = open(file_to_open)

print(f.read())

Python 3.4, pathlib adlı dosya ve yollarla ilgilenmek için yeni bir standart kitaplık tanıttı. Benim için çalışıyor!


0
2017-08-03 10:57