在Python中的相对位置打开文件
假设python的代码在以前的windows目录中不知道执行,说'main',而且在运行代码的时候需要访问目录'main / 2091 / data.txt'。
我应该如何使用open(location)函数? 应该是位置?
编辑:
我发现下面的简单代码将工作..是否有任何缺点?
file="\2091\sample.txt" path=os.getcwd()+file fp=open(path,'r+');
有了这种types的事情,你需要小心你的实际工作目录是什么。 例如,您不能从文件所在的目录运行脚本。在这种情况下,您不能仅使用相对path。
如果您确定所需的文件位于脚本实际所在的子目录下,则可以使用__file__
来帮助您。 __file__
是您正在运行的脚本所在位置的完整path。
所以你可以摆弄这样的东西:
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)
我创build了一个账户,这样我就可以澄清我认为我在Russ原来的回答中发现的差异。
作为参考,他最初的答案是:
import os script_dir = os.path.dirname(__file__) rel_path = "2091/data.txt" abs_file_path = os.path.join(script_dir, rel_path)
这是一个很好的答案,因为它试图dynamic创build一个绝对的系统path到所需的文件。
Cory Mawhorter注意到__file__
是一个相对path(在我的系统上也是如此),并使用os.path.abspath(__file__)
build议。 但是, os.path.abspath
返回当前脚本的绝对path(即/path/to/dir/foobar.py
)
要使用这个方法(以及我最终如何工作),必须从path的末尾删除脚本名称:
import os script_path = os.path.abspath(__file__) # ie /path/to/dir/foobar.py script_dir = os.path.split(script_path)[0] #ie /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的解决scheme,像这样:
from os import path file_path = path.relpath("2091/data.txt") with open(file_path) as f: <do stuff>
应该工作正常。
path
模块能够为其运行的任何操作系统格式化path。 此外,只要你有正确的权限,python处理相对path就好了。
编辑 :
正如在评论中提到的那样,python可以在unix风格和windows风格的path之间进行转换,所以即使是简单的代码也可以工作:
with open("2091/data/txt") as f: <do stuff>
这就是说, path
模块仍然有一些有用的function。
不知道这是否在任何地方工作。
我在Ubuntu上使用ipython。
如果您想读取当前文件夹的子目录中的文件:
/current-folder/sub-directory/data.csv
您的脚本是在当前文件夹只是试试这个:
import pandas as pd path = './sub-directory/data.csv' pd.read_csv(path)
Python只是把你给它的文件名传递给操作系统,打开它。 如果你的操作系统支持像main/2091/data.txt
这样的相对path(提示:确实如此),那么就可以正常工作。
你可能会发现,回答这个问题最简单的方法就是试试看看会发生什么。