web-dev-qa-db-ja.com

Pythonで相対的な場所にファイルを開く

Pythonコードが 'main'と言う以前のwindowsディレクトリで知られていない状態で実行され、実行時にどこにコードがインストールされていても 'main/2091/data.txt'ディレクトリにアクセスする必要があるとします。

open(location)関数はどうやって使うの?場所は何ですか?

編集する

以下の簡単なコードでうまくいくことがわかりました。

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

この種のことでは、実際の作業ディレクトリが何であるかに注意する必要があります。たとえば、ファイルがあるディレクトリからスクリプトを実行することはできません。この場合、相対パスを単独で使用することはできません。

必要なファイルがスクリプトが実際に配置されている場所の下のサブディレクトリにあることが確実な場合は、__file__を使用してここで手助けすることができます。 __file__は、実行しているスクリプトがある場所へのフルパスです。

それで、あなたはこのような何かでいじることができます:

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)
149
Russ

このコードはうまくいきます:

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)
28
Fahad Haleem

私は、Russの最初の回答で見つけたと思う矛盾を明確にするために、アカウントを作成しました。

参考までに、彼の最初の答えは、

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

目的のファイルへの絶対システムパスを動的に作成しようとしているので、これは素晴らしい答えです。

Cory Mawhorterは__file__が相対パスであることに気付き(私のシステムでも同じです)、os.path.abspath(__file__)を使うことを提案しました。 os.path.abspathは、現在のスクリプトの絶対パスを返します(例:/path/to/dir/foobar.py)。

この方法を使うには(そして私がどうやって動かしたのか)、パスの末尾からスクリプト名を削除する必要があります。

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)

結果のabs_file_path(この例では)は次のようになります。/path/to/dir/2091/data.txt

19
Grant Hulegaard

使用しているオペレーティングシステムによって異なります。 Windowsと* nixの両方と互換性のあるソリューションが必要な場合は、次のようにします。

from os import path

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

うまくいくはずです。

pathモジュールは、それが実行されているどのオペレーティングシステムのパスもフォーマットできます。また、pythonはあなたが正しいパーミッションを持っている限り、相対パスをうまく扱えます。

編集

コメントのkindallで述べられているように、pythonは、とにかくunixスタイルのパスとwindowsスタイルのパスの間で変換することができるので、もっと単純なコードでもうまくいくでしょう:

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

とはいえ、 pathモジュール にはまだ便利な機能がいくつかあります。

17
Wilduck

コード:

import os
script_path = os.path.abspath(__file__) 
path_list = script_path.split(os.sep)
script_directory = path_list[0:len(path_list)-1]
rel_path = "main/2091/data.txt"
path = "/".join(script_directory) + "/" + rel_path

説明:

インポートライブラリ:

import os

現在のスクリプトのパスを取得するには、__file__を使用します。

script_path = os.path.abspath(__file__)

スクリプトパスを複数の項目に分割します。

path_list = script_path.split(os.sep)

リストの最後の項目(実際のスクリプトファイル)を削除します。

script_directory = path_list[0:len(path_list)-1]

相対ファイルのパスを追加します。

rel_path = "main/2091/data.txt

リスト項目を結合して、相対パスのファイルを追加します。

path = "/".join(script_directory) + "/" + rel_path

今、あなたはファイルであなたが望むことなら何でもするように設定されています、例えば:

file = open(path)
7
Patriots299

私は自分のコードがWindowsシステム上でPython 3を実行している私のファイルを見つけることができなかった理由を見つけるために多くの時間を費やします。それで私は付け加えました。前に/そしてすべてがうまくいった:

import os

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, './output03.txt')
print(file_path)
fptr = open(file_path, 'w')
5
Ângelo Polotto

ファイルがあなたの親フォルダにあるなら、例えば。 follower.txt、あなたは単にopen('../follower.txt', 'r').read()を使うことができます

2
Olivia Liao

これを試して:

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と呼ばれるファイルとパスを扱うための新しい標準ライブラリを導入しました。わたしにはできる!

2
dcampos

これが至るところで機能するかどうかわからない。

私はubuntuでipythonを使っています。

現在のフォルダのサブディレクトリにあるファイルを読みたい場合:

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

あなたのスクリプトはcurrent-folderにあります。

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

Pythonはあなたがそれを開くオペレーティングシステムにあなたがそれを与えたファイル名を渡すだけです。あなたのオペレーティングシステムがmain/2091/data.txtのような相対パスをサポートしているなら(ヒント:それはそうしている)、それはそれでうまくいくでしょう。

このような質問に答えるための最も簡単な方法は、それを試して何が起こるのかを見ることです。

1
kindall