在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(提示:确实如此),那么就可以正常工作。

你可能会发现,回答这个问题最简单的方法就是试试看看会发生什么。