Cree una nueva carpeta con pathlib y escriba archivos en ella

3 minutos de lectura

Avatar de usuario de Bondrak
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)

  • eso es porque mkdir devoluciones None. 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 siempre filepath = 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

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.

fuente

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

Avatar de usuario de Davos
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 modeentonces bufferingy 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)

¿Ha sido útil esta solución?