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

假设我的 python 代码执行一个名为 main的目录,并且应用程序需要访问 main/2091/data.txt

我应该如何使用 open(location)? 参数 location应该是什么?

我发现以下简单的代码将工作. . 它有什么缺点吗?

file = "\2091\sample.txt"
path = os.getcwd()+file
fp = open(path, 'r+');
708537 次浏览

这取决于您使用的是什么操作系统。如果你想要一个兼容 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模块仍然有一些有用的功能。

Python 只是将您提供的文件名传递给操作系统,然后由操作系统打开它。如果您的操作系统支持像 main/2091/data.txt这样的相对路径(提示: 它确实支持) ,那么这将很好地工作。

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

对于这类事情,你需要小心你的实际工作目录是什么。例如,您可能不会从文件所在的目录运行脚本。在这种情况下,您不能仅仅使用相对路径本身。

如果您确定所需的文件位于脚本实际所在的子目录中,那么可以使用 __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)

不知道这是否适用于所有地方。

我在 ubuntu 中使用 ipython。

如果要读取当前文件夹的子目录中的文件:

/current-folder/sub-directory/data.csv
你的脚本在当前文件夹中 试试这个:
import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)

我创建了一个账户就是为了澄清我在拉斯的原始回复中发现的矛盾之处。

作为参考,他最初的回答是:

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

这个代码运行良好:

import os


def read_file(file_name):
file_handle = open(file_name)
print file_handle.read()
file_handle.close()


file_dir = os.path.dirname(os.path.realpath('__file__'))
print file_dir


#For accessing the file in the same folder
file_name = "same.txt"
read_file(file_name)


#For accessing the file in a folder contained in the current folder
file_name = os.path.join(file_dir, 'Folder1.1/same.txt')
read_file(file_name)


#For accessing the file in the parent folder of the current folder
file_name = os.path.join(file_dir, '../same.txt')
read_file(file_name)


#For accessing the file inside a sibling folder.
file_name = os.path.join(file_dir, '../Folder2/same.txt')
file_name = os.path.abspath(os.path.realpath(file_name))
print file_name
read_file(file_name)

如果该文件位于您的父文件夹中,例如 follow. 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!

我花了很多时间来研究为什么我的代码在 Windows 系统上找不到运行 Python3的文件。所以我加了一句。之前/之后一切都很顺利:

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

密码:

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)
import os
def file_path(relative_path):
dir = os.path.dirname(os.path.abspath(__file__))
split_path = relative_path.split("/")
new_path = os.path.join(dir, *split_path)
return new_path


with open(file_path("2091/data.txt"), "w") as f:
f.write("Powerful you have become.")
当我还是个初学者的时候,我发现这些描述有点吓人 For Windows

f= open('C:\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f)

这会使血氧饱和度升高。我以前经常糊涂。然后在谷歌上冲浪。找到了错误发生的原因。为初学者写这个

这是因为要在 Unicode 中读取路径,只需在启动文件路径时添加一个 \

f= open('C:\\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f)

现在只需在启动目录之前添加 \即可。

得到父文件夹的路径,然后 os.join你的相对文件到结束。

# get parent folder with `os.path`
import os.path


BASE_DIR = os.path.dirname(os.path.abspath(__file__))


# now use BASE_DIR to get a file relative to the current script
os.path.join(BASE_DIR, "config.yaml")

pathlib也是如此:

# get parent folder with `pathlib`'s Path
from pathlib import Path


BASE_DIR = Path(__file__).absolute().parent


# now use BASE_DIR to get a file relative to the current script
BASE_DIR / "config.yaml"

在 Python 3.4(PEP 428)中引入了 pathlib,允许您以面向对象的方式处理文件:

from pathlib import Path


working_directory = Path(os.getcwd())
path = working_directory / "2091" / "sample.txt"
with path.open('r+') as fp:
# do magic

with关键字还将确保您的资源得到正确的关闭,即使您遇到了一些错误(如未处理的 Exception、 sigint 或类似的)