64

我正在做这样的事情:

import pathlib

p = pathlib.Path("temp/").mkdir(parents=True, exist_ok=True)

with p.open("temp."+fn, "w", encoding ="utf-8") as f:
    f.write(result)

错误消息:AttributeError:“NoneType”对象没有“打开”属性

显然,根据错误消息,mkdir返回None.

Jean-Francois Fabre 提出了这样的修正:

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)

with p.open("temp."+fn, "w", encoding ="utf-8") as f:
    ...

这触发了一条新的错误消息:

文件“/Users/user/anaconda/lib/python3.6/pathlib.py”,第 1164 行,在 open opener=self._opener)
TypeError: an integer is required (got type str)

4

5 回答 5

78

你可以试试:

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
fn = "test.txt" # I don't know what is your fn
filepath = p / fn
with filepath.open("w", encoding ="utf-8") as f:
    f.write(result)

您不应该将字符串作为路径。filepath具有方法的是您的对象open

来源

于 2017-12-05T10:58:13.457 回答
27

您可以直接为属性初始化filepath和创建父目录:parent

from pathlib import Path

filepath = Path("temp/test.txt")
filepath.parent.mkdir(parents=True, exist_ok=True)

with filepath.open("w", encoding ="utf-8") as f:
    f.write(result)
于 2020-04-16T09:32:27.133 回答
13

pathlib模块提供的方法open内置的open函数的签名略有不同。

路径库:

Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)

内置:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

在这种情况下,p = pathlib.Path("temp/")它创建了一个路径p,因此p.open("temp."+fn, "w", encoding ="utf-8")使用位置参数(不使用关键字)调用期望第一个是mode,然后是buffering,并且buffering期望一个整数,这就是错误的本质;需要一个整数,但它收到了字符串'w'

此调用p.open("temp."+fn, "w", encoding ="utf-8")试图打开路径p(这是一个目录)并提供一个不受支持的文件名。您必须构造完整路径,然后调用路径的 open 方法或将完整路径传递给 open 内置函数。

于 2018-04-20T00:35:16.997 回答
9

也许,这是你想做的最短的代码。

import pathlib

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
(p / ("temp." + fn)).write_text(result, encoding="utf-8")

在大多数情况下,使用write_text()甚至不需要 open() 上下文。

于 2020-06-12T16:07:26.877 回答
1

您还可以执行以下操作:

text_path = Path("random/results").resolve()
text_path.mkdir(parents=True, exist_ok=True)
(text_path / f"{title}.txt").write_text(raw_text)
于 2021-08-21T13:14:21.240 回答