我试图用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复制文件?
自Python 3.5以来,无需导入
shutil
,就可以执行以下操作:对于Python 2.7,^{} 提供了
read_bytes
、read_text
、write_bytes
和write_text
方法。文件将加载到内存中,因此此方法不适用于大于计算机可用内存的文件。
根据注释,可以使用
write_bytes
和read_bytes
来复制文本文件,但是如果您需要在复制时处理编码write_text
,则read_text
显示了两个额外参数的优点:encoding
是用于解码或编码文件的编码的名称errors
是一个可选字符串,指定如何处理编码和解码错误它们的含义与^{} 中的相同。
那这个呢?
问题是
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
类型参数。你真正想写的是:
您可以子类化Path以包含这样的方法,并调整
my_file
的创建。我发现在现有的pathlib.Path
上移植/monkey-patch/duck-punch更容易只要在对任何
Path
实例调用.copy
方法之前执行此代码,就可以将其放在任何地方。.copy()
的参数可以是文件或目录。相关问题 更多 >
编程相关推荐