使用 pathlib 创建新文件夹并将文件写入其中

Create new folder with pathlib and write files into it

我正在做这样的事情:

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)

Error message: AttributeError: 'NoneType' object has no attribute 'open'

显然,根据错误消息,mkdir returns None

让-弗朗索瓦·法布尔建议进行此更正:

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

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

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

File "/Users/user/anaconda/lib/python3.6/pathlib.py", line 1164, in open opener=self._opener)
TypeError: an integer is required (got type str)

你可以试试:

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.

source

pathlib module offers an open method that has a slightly different signature to the built-in 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 内置函数。

可以直接初始化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)

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

import pathlib

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

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

您还可以执行以下操作:

text_path = Path("random/results").resolve()
text_path.mkdir(parents=True, exist_ok=True)
(text_path / f"{title}.txt").write_text(raw_text)