Pythonコードが 'main'と言う以前のwindowsディレクトリで知られていない状態で実行され、実行時にどこにコードがインストールされていても 'main/2091/data.txt'ディレクトリにアクセスする必要があるとします。
open(location)関数はどうやって使うの?場所は何ですか?
編集する
以下の簡単なコードでうまくいくことがわかりました。
file="\2091\sample.txt"
path=os.getcwd()+file
fp=open(path,'r+');
この種のことでは、実際の作業ディレクトリが何であるかに注意する必要があります。たとえば、ファイルがあるディレクトリからスクリプトを実行することはできません。この場合、相対パスを単独で使用することはできません。
必要なファイルがスクリプトが実際に配置されている場所の下のサブディレクトリにあることが確実な場合は、__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)
このコードはうまくいきます:
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)
私は、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
使用しているオペレーティングシステムによって異なります。 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
モジュール にはまだ便利な機能がいくつかあります。
コード:
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)
私は自分のコードが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')
ファイルがあなたの親フォルダにあるなら、例えば。 follower.txt、あなたは単にopen('../follower.txt', 'r').read()
を使うことができます
これを試して:
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と呼ばれるファイルとパスを扱うための新しい標準ライブラリを導入しました。わたしにはできる!
これが至るところで機能するかどうかわからない。
私はubuntuでipythonを使っています。
現在のフォルダのサブディレクトリにあるファイルを読みたい場合:
/current-folder/sub-directory/data.csv
あなたのスクリプトはcurrent-folderにあります。
import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)
Pythonはあなたがそれを開くオペレーティングシステムにあなたがそれを与えたファイル名を渡すだけです。あなたのオペレーティングシステムがmain/2091/data.txt
のような相対パスをサポートしているなら(ヒント:それはそうしている)、それはそれでうまくいくでしょう。
このような質問に答えるための最も簡単な方法は、それを試して何が起こるのかを見ることです。