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_text
read_text
présente l'avantage de deux paramètres supplémentaires:
encoding
est le nom de l'encodage utilisé pour décoder ou encoder le fichiererrors
est 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()
.