我会通过二进制复制来破坏文本文件吗?

Inv*_*sus 1 python file-io python-3.x python-3.4

我想复制文件/目录树(当然是递归地),文件名中包含错误的字符.所以,我打开文件,读取其内容,并将它们转储到一个名为clean的新文件中.

如果文件的内容是文本,并且我在二进制模式下读取()它们到write(),是否有可能损坏内容?

for name in os.listdir(src_path):
    name = clean_name(name)
    src_full = os.sep.join((src_path, name))
    dst_full = os.sep.join((dst_path, name))
    ...
    if isfile(src_full):
        with open(dst_full, 'xb'): as dst_file:
            with open(src_full, 'rb')) as src_file:
               dst_file.write(src_file.read())
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

不,没有机会损坏内容.您可以按原样阅读确切的内容,只要您的硬件可以为您提供准确的内容.

什么可以发生的是,你忘了所有要复制的文件的元数据 ; 例如,访问控制信息以及修改和创建日期都会丢失.

而不是将整个文件读入内存,使用该shutil.copyfile()函数为您处理文件副本; 它会以块的形式复制数据.更好的是,使用shutil.copy()shutil.copy2()函数,它也将复制权限; copy2()还复制文件访问和创建时间.

所有三个函数都以二进制模式打开文件; 源打开'rb',目的地用'wb'.如果你必须有独占开放(模式'xb'),你需要自己打开文件对象(就像你已经做的那样)并使用它shutil.copyfileobj()来获得有效的文件副本,然后通过shutil.copymode()调用(复制shutil.copy()和复制文件权限)或者shutil.copystat()打电话(复制什么shutil.copy2()).