shutil.copyfileobjpython中的方法在合并文件时也复制BOM字符

2024-10-05 10:15:42 发布

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

我有一个用utf-16le编码创建的临时文件列表。我需要合并那些临时文件和结果文件应该在utf-16。在

我所做的一切

for fd in source_fds_list:
   with open(destination_url, 'ab') as destn_fd:
       shutil.copyfileobj(fd, destn_fd)
   fd.close()

这将导致在目标文件中追加多个BOM表。在

对于上述情况,我几乎没有什么解决办法

  • 需要检查并删除/跳过每个临时文件中的BOM字符
  • 以utf-8格式创建没有BOM字符的临时文件,然后使用copyfileobj合并它们

如果临时文件是用不同的编码方式编写的呢?在

除了使用文件读取手动检查BOM表之外,是否存在更好的解决方案?在


Tags: 文件insource编码列表forwithbom
1条回答
网友
1楼 · 发布于 2024-10-05 10:15:42

shutil.copyfileobj()复制所有数据,不管如何。BOM只是文件中的数据,shutil不是也不会知道这种文件格式的特定细节。在

您可以轻松地跳过BOM,但仍将大部分复制工作留给shutil.copyfileobj()

import codecs

for fd in source_fds_list:
   with open(destination_url, 'ab') as destn_fd:
       with fd:
           start = fd.read(2)
           if start != codecs.BOM_UTF16_LE:
               destn_fd.write(start)
           shutil.copyfileobj(fd, destn_fd)

通过首先从源文件中读取最初的2个字节,shutil.copyfileobj()将继续读取文件中的所有内容,跳过BOM。不管怎样,shutil.copyfileobj()在幕后所做的就是调用data = source.read(buffer)和{}。在

如果您不知道用于输入文件的编解码器,那么您将陷入启发式。您可以测试各种^{} BOM constants,但随后出现误报的可能性;一个使用非UTF-*编解码器编码的文件和初始字节看起来像BOM:

^{pr2}$

相关问题 更多 >

    热门问题