Copier le fichier avec pathlib en Python
j'essaye de copier un fichier avec pathlib
import pathlib
import shutil
my_file=pathlib.Path('/etc/hosts')
to_file=pathlib.Path('/tmp/foo')
shutil.copy(my_file, to_file)
je bénéficier de cette exception:
/home/foo_egs_d/bin/python /home/foo_egs_d/src/test-pathlib-copy.py
Traceback (most recent call last):
File "/home/foo_egs_d/src/test-pathlib-copy.py", line 6, in <module>
shutil.copy(my_file, to_file)
File "/usr/lib/python2.7/shutil.py", line 117, in copy
if os.path.isdir(dst):
File "/home/foo_egs_d/lib/python2.7/genericpath.py", line 41, in isdir
st = os.stat(s)
TypeError: coercing to Unicode: need string or buffer, PosixPath found
Process finished with exit code
... comment copier un fichier avec pathlib en Python 2.7?
4 réponses
alors qu'en est-il de ceci?
import pathlib
import shutil
my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')
shutil.copy(str(my_file), str(to_file))
Le problème est pathlib.Path créer un PosixPath object si vous utilisez Unix / Linux,WindowsPath si vous utilisez Microsoft Windows.
Mais shutil.copy() besoin de chaîne comme arguments. Juste utiliser str() ici, quand vous utilisez str() fonction Path object il retournera le chemin original.
la cause de shutil.copy() ne pas fonctionner, c'est que vous n'utilisez pas le dernier Python, Python 3.6 shutil.copy() poignée Path les objets (ou leurs sous-classes). Que pour les versions plus anciennes de Python cela envoie une erreur est parce que ces implémentations de shutil attendre arguments de la chaîne copy, et non pathlib.Path taper les arguments.
ce que vous voulez réellement être capable d'écrire est:
my_file.copy(to_file)
vous pouvez sous-classe chemin pour inclure une telle méthode, et de s'adapter à la création d' my_file. Je trouve ça plus facile de greffon/singe-patch/canard-coup de poing sur l'existant pathlib.Path
from pathlib import Path
def _copy(self, target):
import shutil
assert self.is_file()
shutil.copy(str(self), str(target)) # str() only there for Python < (3, 6)
Path.copy = _copy
vous pouvez mettre ce code n'importe où, à condition qu'il soit exécuté avant d'appeler le .copy méthode sur les Path instances. L'argument de .copy() peut être un fichier ou un répertoire.
depuis Python 3.5, sans importer shutil, vous pouvez faire:
from pathlib import Path
dest = Path('dest')
src = Path('src')
dest.write_bytes(src.read_bytes()) #for binary files
dest.write_text(src.read_text()) #for text files
Pour Python 2.7,pathlib2 offre read_bytes,read_text,write_bytes et write_text méthodes.
le fichier sera chargé en mémoire, de sorte que cette méthode ne convient pas pour les fichiers plus grands que la mémoire des machines disponibles.
selon les commentaires, on peut utiliser write_bytes et read_bytes pour copier des fichiers texte, mais si vous avez besoin de traiter l'encodage au moment de la copie write_textread_text présente l'avantage de deux paramètres supplémentaires:
encodingest le nom de l'encodage utilisé pour décoder ou encoder le fichiererrorsest une chaîne de caractères optionnelle qui spécifie comment les erreurs d'encodage et de décodage doivent être traitées
ils ont tous les deux le même sens que dans open().