用Python中的pathlib复制文件

2024-04-24 14:52:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pathlib复制一个文件

import pathlib
import shutil

my_file=pathlib.Path('/etc/hosts')
to_file=pathlib.Path('/tmp/foo')
shutil.copy(my_file, to_file)

我有个例外:

/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

。。。如何在Python2.7中使用pathlib复制文件?


Tags: 文件toinpyimporthomefoomy
3条回答

自Python 3.5以来,无需导入shutil,就可以执行以下操作:

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

对于Python 2.7,^{}提供了read_bytesread_textwrite_byteswrite_text方法。

文件将加载到内存中,因此此方法不适用于大于计算机可用内存的文件。

根据注释,可以使用write_bytesread_bytes来复制文本文件,但是如果您需要在复制时处理编码write_text,则read_text显示了两个额外参数的优点:

  • encoding是用于解码或编码文件的编码的名称
  • errors是一个可选字符串,指定如何处理编码和解码错误

它们的含义与^{}中的相同。

那这个呢?

import pathlib
import shutil

my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')
shutil.copy(str(my_file), str(to_file))

问题是pathlib.Path如果使用的是Unix/Linux,则创建一个PosixPath对象;如果使用的是Microsoft Windows,则创建一个WindowsPath对象。

但是shutil.copy()以字符串作为参数。所以只要在这里使用str()函数,当对Path对象使用str()函数时,它将返回Path对象引用的路径作为字符串。

shutil.copy()不起作用的原因是您没有使用最新的Python,Python 3.6shutil.copy()可以处理Path对象(或其子类)。对于较旧版本的Python,这会引发一个错误,因为那些shutil的实现需要copy的字符串参数,而不是pathlib.Path类型参数。

你真正想写的是:

my_file.copy(to_file)

您可以子类化Path以包含这样的方法,并调整my_file的创建。我发现在现有的pathlib.Path上移植/monkey-patch/duck-punch更容易

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

只要在对任何Path实例调用.copy方法之前执行此代码,就可以将其放在任何地方。.copy()的参数可以是文件或目录。

相关问题 更多 >