web-dev-qa-db-fra.com

créer un nouveau dossier en python avec pathlib et y écrire des fichiers

Je fais quelque chose comme ça:

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)

Message d'erreur: AttributeError: l'objet 'NoneType' n'a pas d'attribut 'open'

Évidemment, en fonction du message d'erreur, mkdir renvoie None

Jean-François Fabre a suggéré cette correction: 

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)

with p.open("temp."+fn, "w", encoding ="utf-8") as f:
    ...

Cela a déclenché un nouveau message d'erreur:

Fichier "/Users/user/anaconda/lib/python3.6/pathlib.py", ligne 1164, ouvert .__ ouvreur = self._opener)
TypeError: un entier est requis (type obtenu str)

3
Bondrak

Le module pathlib offre une méthode open qui a une signature légèrement différente de la fonction open intégrée. 

pathlib:

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

L'intégré: 

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

Dans le cas de cette p = pathlib.Path("temp/"), il a créé un chemin p. Par conséquent, si vous appelez p.open("temp."+fn, "w", encoding ="utf-8") avec des arguments de position (sans mot-clé), le premier doit être mode, puis buffering et buffering suppose un entier, et c’est l’essence de l’erreur; un entier est attendu mais il a reçu la chaîne 'w'

Cet appel p.open("temp."+fn, "w", encoding ="utf-8") tente d'ouvrir le chemin p (qui est un répertoire) et fournit également un nom de fichier qui n'est pas pris en charge. Vous devez construire le chemin complet, puis appeler la méthode open du chemin ou transmettre le chemin complet à la fonction intégrée open.

1
Davos

Tu pourrais essayer:

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)

Vous ne devriez pas donner une chaîne comme chemin. C'est votre objet filepath qui a la méthode open.

la source

9
Till