Bondrak
Estoy haciendo algo como esto:
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)
Mensaje de error: AttributeError: el objeto ‘NoneType’ no tiene atributo ‘open’
Obviamente, según el mensaje de error, mkdir
devoluciones None
.
Jean-Francois Fabre sugirió esta corrección:
p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
with p.open("temp."+fn, "w", encoding ="utf-8") as f:
...
Esto provocó un nuevo mensaje de error:
Archivo “/Users/user/anaconda/lib/python3.6/pathlib.py”, línea 1164, en open opener=self._opener)
TypeError: se requiere un número entero (se obtuvo el tipo str)
Tu podrías intentar:
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)
No deberías dar una cadena como ruta. es tu objeto filepath
que tiene el metodo open
.
Puede inicializar directamente filepath
y crear directorios principales para parent
atributo:
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)
Tal vez, este es el código más corto que desea hacer.
import pathlib
p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
(p / ("temp." + fn)).write_text(result, encoding="utf-8")
En la mayoría de los casos, ni siquiera necesita el contexto open() usando escribir_texto() en cambio.
-
Path.write_text() solo escribe una cadena. Si tenemos una lista de cadenas, no funcionará.
– Mai Hai
16 de febrero de 2021 a las 5:38
davos
El rutalib módulo ofrece una open
método que tiene una firma ligeramente diferente a la incorporada abierto función.
rutalib:
Path.open(mode="r", buffering=-1, encoding=None, errors=None, newline=None)
El incorporado:
open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
En el caso de este p = pathlib.Path("temp/")
ha creado un camino p
tan llamando p.open("temp."+fn, "w", encoding ="utf-8")
con argumentos posicionales (sin usar palabras clave) espera que el primero sea mode
entonces buffering
y buffering
espera un número entero, y esa es la esencia del error; se esperaba un entero pero recibió la cadena 'w'
.
Esta llamada p.open("temp."+fn, "w", encoding ="utf-8")
está tratando de abrir el camino p
(que es un directorio) y también proporciona un nombre de archivo que no es compatible. Debe construir la ruta completa y luego llamar al método abierto de la ruta o pasar la ruta completa a la función integrada abierta.
También puedes hacer algo como:
text_path = Path("random/results").resolve()
text_path.mkdir(parents=True, exist_ok=True)
(text_path / f"{title}.txt").write_text(raw_text)
eso es porque
mkdir
devolucionesNone
. No puedes encadenar llamadas así.– Jean-François Fabre
♦
27/11/2017 a las 19:55
has probado
p = pathlib.Path("temp/"); p.mkdir(parents=True, exist_ok=True)
entonces lo de siemprefilepath = p / fn; with filepath.open("w", encoding ="utf-8") as f: f.write(result)
?–Charlie Parker
21 de enero de 2021 a las 16:58