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

我正在做这样的事情:

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’对象没有属性‘ open’

显然,根据错误消息,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行,打开 Opener = self _ opener)
TypeError: 需要一个整数(类型为 str)

129797 次浏览

You could try:

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)

You shouldn't give a string as path. It is your object filepath which has the method open.

source

The pathlib module offers an open method that has a slightly different signature to the built-in open function.

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

The built-in:

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

In the case of this p = pathlib.Path("temp/") it has created a path p so calling p.open("temp."+fn, "w", encoding ="utf-8") with positional arguments (not using keywords) expects the first to be mode, then buffering, and buffering expects an integer, and that is the essence of the error; an integer is expected but it received the string 'w'.

This call p.open("temp."+fn, "w", encoding ="utf-8") is trying to open the path p (which is a directory) and also providing a filename which isn't supported. You have to construct the full path, and then either call the path's open method or pass the full path into the open built-in function.

You can directly initialize filepath and create parent directories for parent attribute:

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)

Maybe, this is the shortest code you want to do.

import pathlib


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

In most cases, it doesn't need even open() context by using write_text() instead.

You can also do something like:

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