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?

21
demandé sur guettli 2015-11-10 11:45:09

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.

17
répondu Kevin Guan 2015-11-10 09:32:14

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.

10
répondu Anthon 2017-05-03 10:13:38

Vous pouvez utiliser pathlib renommer la méthode au lieu de shutil.déplacer.)(

import pathlib

my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')
my_file.rename(to_file)
6
répondu Geoff D 2018-05-22 08:39:32

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:

  • encoding est le nom de l'encodage utilisé pour décoder ou encoder le fichier
  • errors 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().

4
répondu Jacques Gaudin 2018-03-27 20:52:12