I'm doing something like this:
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'
Obviously, based on the error message, mkdir returns None.
Jean-Francois Fabre suggested this correction:
p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
with p.open("temp."+fn, "w", encoding ="utf-8") as f:
...
This triggered a new error message:
File "/Users/user/anaconda/lib/python3.6/pathlib.py", line 1164, in open
opener=self._opener)
TypeError: an integer is required (got type str)
解决方案
The pathlib module offers an open method that has a slightly different signature to the built-in open function.
pathlib:
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.