gue*_*tli 43 python copy file python-2.x pathlib
我尝试复制一个文件 pathlib
import pathlib
import shutil
my_file=pathlib.Path('/etc/hosts')
to_file=pathlib.Path('/tmp/foo')
shutil.copy(my_file, to_file)
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
/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
Run Code Online (Sandbox Code Playgroud)
...如何在Python 2.7中使用pathlib复制文件?
Kev*_*uan 39
那么这个怎么样?
import pathlib
import shutil
my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')
shutil.copy(str(my_file), str(to_file))
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Unix/Linux,那么问题就是pathlib.Path创建一个PosixPath对象,WindowsPath如果您使用的是Microsoft Windows.
但shutil.copy()需要字符串作为参数.所以只需str()在这里使用,当你str()在Path对象上使用函数时,它将返回原始路径.
Ant*_*hon 25
shutil.copy()不工作的原因是你没有使用最新的Python,Python 3.6 shutil.copy() 可以处理Path对象(或其子类).对于旧版本的Python,这会引发错误,因为那些shutil期望字符串参数的实现copy,而不是pathlib.Path类型参数.
你真正想要写的是:
my_file.copy(to_file)
Run Code Online (Sandbox Code Playgroud)
您可以将Path子类化为包含此类方法,并调整其创建my_file.我发现更容易移植/猴子补丁/鸭子打它现有的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
Run Code Online (Sandbox Code Playgroud)
只要.copy在任何Path实例上调用方法之前执行它,就可以将此代码放在任何您喜欢的位置.参数.copy()可以是文件或目录.
Jac*_*din 17
从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
Run Code Online (Sandbox Code Playgroud)
对于Python 2.7,pathlib2提供read_bytes,read_text,write_bytes和write_text方法.
该文件将被加载到内存中,因此该方法不适用于大于机器可用内存的文件.
按照该意见,可以使用write_bytes和read_bytes复制文本文件,但如果你需要处理的复印时间编码write_text的read_text存在的两个额外的参数的优势:
encoding 是用于解码或编码文件的编码的名称errors 是一个可选字符串,指定如何处理编码和解码错误它们都具有相同的含义open().
您可以使用 pathlib3x - 它提供了最新的向后移植(在撰写本答案时为 Python 3.11.a0)Python 3.6 或更高版本的 Python pathlib,以及一些附加功能,例如copy、copy2等...
$> python -m pip install pathlib3x
$> python
>>> import pathlib3x as pathlib
>>> my_file = pathlib.Path('/etc/hosts')
>>> to_file = pathlib.Path('/tmp/foo')
>>> my_file.copy(to_file)
Run Code Online (Sandbox Code Playgroud)
免责声明:我是 pathlib3x 库的作者。
如何在Python 3.6中shutil转换为接受pathlib.Path对象
如/sf/answers/2822335001/所述,Python 3.6中的shutdownil可以接收pathlib.Path对象。
由于这感觉很神奇,因此我决定研究一下它是如何实现的,以查看是否可以在自己的类中重用此魔术。
改进是PEP 519的结果:https : //www.python.org/dev/peps/pep-0519/
这概括了很多stdlib功能,结果并没有持续更新文档,包括shutil从3.7开始的大多数文档,仅文档支持单个功能。欢迎来到动态打字的乐趣。
在有文档记录的地方,stlib链接到“类路径对象”的词汇表:https ://docs.python.org/3/glossary.html#term-path-like-object
表示文件系统路径的对象。类路径对象可以是表示路径的str或bytes对象,也可以是实现os.PathLike协议的对象。支持os.PathLike协议的对象可以通过调用os.fspath()函数转换为str或bytes文件系统路径。可以分别使用os.fsdecode()和os.fsencode()来保证str或bytes结果。由PEP 519引入。
然后链接到以下文档的文档os.PathLike:https : //docs.python.org/3/glossary.html#term-path-like-object
代表文件系统路径的对象的抽象基类,例如pathlib.PurePath。
3.6版的新功能。
abstractmethod __fspath__()返回对象的文件系统路径表示形式。
该方法应仅返回str或bytes对象,首选项为str。
关键实现的提交似乎是:
Modules/posixmodule.c__fspath__到pathlib.PurePath如果要实现自己的类路径类,则可以执行以下操作:
#!/usr/bin/env python3
class MyPath:
def __init__(self, path):
self.path = path
def __fspath__(self):
return self.path
with open(MyPath('f'), 'w'):
pass
Run Code Online (Sandbox Code Playgroud)
已在Ubuntu 3.10,Python 3.6.7中测试。
| 归档时间: |
|
| 查看次数: |
22320 次 |
| 最近记录: |