Reputation: 1590
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)
Upvotes: 146
Views: 227832
Reputation: 799
You are almost there. The full pathlib
version would be something like:
folder = "path/to/folder"
file_base = "file_name_base"
file_extension = ".extension"
p_folder = pathlib.Path(folder)
p_file_base = p_folder / file_base
p_file = p_file_base.with_suffix(file_extension)
p_file.parent.mkdir(parents=True, exist_ok=True) # or `p_folder`
p_file.write_text("Your text here", encoding ="utf-8")
I decomposed all steps to make it as transparent as possible, you can shorten this code. For example:
p_file = pathlib.Path("path/to/folder/file_base")
p_file.parent.mkdir(parents=True, exist_ok=True)
p_file.with_suffix(".extension").write_text("Your text here", encoding ="utf-8")
Upvotes: 3
Reputation: 334
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)
Upvotes: 8
Reputation: 975
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.
Upvotes: 23
Reputation: 31662
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)
Upvotes: 54
Reputation: 5405
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.
Upvotes: 16
Reputation: 4523
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
.
Upvotes: 166