Open file in a relative location in Python
假设python代码是在前面的windows目录不知道的地方执行的,比如说"main",并且在代码运行时安装在任何地方,它都需要访问目录"main/2091/data.txt"。
我应该如何使用开放(位置)功能?地点应该是什么?
编辑:
我发现下面的简单代码可以工作……有什么缺点吗?
1 2 3 | file="\2091\sample.txt" path=os.getcwd()+file fp=open(path,'r+'); |
对于这种类型的东西,您需要注意实际的工作目录是什么。例如,您不能从文件所在的目录运行脚本。在这种情况下,不能只使用相对路径本身。
如果您确定所需的文件位于脚本实际所在的子目录中,那么可以使用
所以你可以摆弄这样的事情:
1 2 3 4 | 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) |
我创建了一个账户,以便澄清我认为在Russ最初的回复中发现的差异。
作为参考,他最初的回答是:
1 2 3 4 | import os script_dir = os.path.dirname(__file__) rel_path ="2091/data.txt" abs_file_path = os.path.join(script_dir, rel_path) |
这是一个很好的答案,因为它试图动态地创建到所需文件的绝对系统路径。
CoryMawhorter注意到
要使用此方法(以及我最终如何使其工作),您必须从路径末尾删除脚本名:
1 2 3 4 5 | 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文件路径(在本例中)变为:
这取决于您使用的操作系统。如果您想要与Windows和*nix兼容的解决方案,请执行以下操作:
1 2 3 4 5 | from os import path file_path = path.relpath("2091/data.txt") with open(file_path) as f: <do stuff> |
应该工作得很好。
编辑:
正如Kindall在注释中提到的,python无论如何都可以在unix样式和windows样式路径之间转换,因此更简单的代码也可以工作:
1 2 | with open("2091/data/txt") as f: <do stuff> |
也就是说,
代码:
1 2 3 4 5 6 | 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 |
说明:
导入库:
1 | import os |
使用文件获得当前脚本的路径:
1 | script_path = os.path.abspath(__file__) |
将脚本路径分隔为多个项目:
1 | path_list = script_path.split(os.sep) |
删除列表中的最后一项(实际脚本文件):
1 | script_directory = path_list[0:len(path_list)-1] |
添加相对文件的路径:
1 | rel_path ="main/2091/data.txt |
加入列表项,并添加相对路径的文件:
1 | path ="/".join(script_directory) +"/" + rel_path |
现在,您将设置为对文件执行所需的操作,例如:
1 | file = open(path) |
我花了很多时间去发现,因为我的代码在Windows系统上找不到运行python 3的文件。所以我补充说。在一切顺利之前:
1 2 3 4 5 6 | 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') |
试试这个:
1 2 3 4 5 6 7 8 | 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的文件和路径。它对我有用!
如果文件在父文件夹中(如follower.txt),则只需使用
不确定这是否适用于任何地方。
我在Ubuntu使用ipython。
如果要读取当前文件夹的子目录中的文件:
1 | /current-folder/sub-directory/data.csv |
您的脚本在当前文件夹中只需尝试以下操作:
1 2 3 | import pandas as pd path = './sub-directory/data.csv' pd.read_csv(path) |
python只是将您给它的文件名传递给操作系统,操作系统将打开它。如果您的操作系统支持像
你可能会发现,回答这样一个问题最简单的方法就是试试看会发生什么。