在python中的相对位置打开文件

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+');


对于这种类型的东西,您需要注意实际的工作目录是什么。例如,您不能从文件所在的目录运行脚本。在这种情况下,不能只使用相对路径本身。

如果您确定所需的文件位于脚本实际所在的子目录中,那么可以使用__file__在这里帮助您。__file__是运行脚本的完整路径。

所以你可以摆弄这样的事情:

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注意到__file__是一个相对路径(在我的系统中也是如此),建议使用os.path.abspath(__file__)。但是,os.path.abspath返回当前脚本的绝对路径(即/path/to/dir/foobar.py)

要使用此方法(以及我最终如何使其工作),您必须从路径末尾删除脚本名:

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文件路径(在本例中)变为:/path/to/dir/2091/data.txt


这取决于您使用的操作系统。如果您想要与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>

应该工作得很好。

path模块能够为其运行的任何操作系统格式化路径。另外,只要您有正确的权限,python就可以很好地处理相对路径。

编辑:

正如Kindall在注释中提到的,python无论如何都可以在unix样式和windows样式路径之间转换,因此更简单的代码也可以工作:

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

也就是说,path模块仍然具有一些有用的功能。


代码:

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),则只需使用open('../follower.txt', 'r').read()


不确定这是否适用于任何地方。

我在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只是将您给它的文件名传递给操作系统,操作系统将打开它。如果您的操作系统支持像main/2091/data.txt这样的相对路径(提示:它支持),那么这将很好地工作。

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