我正在使用Python(3.4,在Windows 7上)下载一组文本文件,但当我读取(并在修改后写入)这些文件时,其中保留的值中出现了一些字节顺序标记(BOM),主要是UTF-8 BOM。最终,我将每个文本文件用作列表(或字符串),但似乎无法删除这些BOM。所以我想知道是否有可能删除BOM?
更多背景信息:这些文本文件是从公共ftp源下载的,用户上传自己的文档,因此原始编码高度可变且未知于我。为确保下载不出错,我将编码指定为UTF-8(使用latin-1会导致错误)。所以我拥有BOM并不神秘,我不认为预先编码/解码的解决方案对我有帮助( Convert UTF-8 with BOM to UTF-8 with no BOM in Python) - 实际上它似乎会增加其它BOM的频率。
当我下载后修改这些文件时,我使用以下语法:
尽管此参数将运行,但不幸的是BOM仍然存在,例如,当我打印列表时(我相信即使我尝试从字符串而不是列表中删除BOM,也会遇到类似的问题:如何删除此特殊字符?)。如果我在列表推导式中放入一个普通单词(非BOM),那个单词将被替换。
我确实理解,如果我逐个打印列表对象,BOM将不会出现(Python中的特殊国家字符不会.split())。并且BOM不在原始文本文件中。但我担心,在运行后续文本分析参数时,这些BOM将保留下来,因此任何以\ufeffword而不是word出现在列表中的对象都将被分析为\ufeffword。
再次提醒,是否可能事后删除BOM?
更多背景信息:这些文本文件是从公共ftp源下载的,用户上传自己的文档,因此原始编码高度可变且未知于我。为确保下载不出错,我将编码指定为UTF-8(使用latin-1会导致错误)。所以我拥有BOM并不神秘,我不认为预先编码/解码的解决方案对我有帮助( Convert UTF-8 with BOM to UTF-8 with no BOM in Python) - 实际上它似乎会增加其它BOM的频率。
当我下载后修改这些文件时,我使用以下语法:
with open(t, "w", encoding='utf-8') as outfile:
with open(f, "r", encoding='utf-8') as infile:
text = infile.read
#Arguments to make modifications follow
稍后,在将“outfiles”读取为列表后,我发现一些单词带有UTF-8 BOM,例如 \ufeff
。我尝试使用以下列表理解式删除BOM:
g = list_outfile #Outfiles now stored as list
g = [i.replace(r'\ufeff','') for i in g]
尽管此参数将运行,但不幸的是BOM仍然存在,例如,当我打印列表时(我相信即使我尝试从字符串而不是列表中删除BOM,也会遇到类似的问题:如何删除此特殊字符?)。如果我在列表推导式中放入一个普通单词(非BOM),那个单词将被替换。
我确实理解,如果我逐个打印列表对象,BOM将不会出现(Python中的特殊国家字符不会.split())。并且BOM不在原始文本文件中。但我担心,在运行后续文本分析参数时,这些BOM将保留下来,因此任何以\ufeffword而不是word出现在列表中的对象都将被分析为\ufeffword。
再次提醒,是否可能事后删除BOM?
outfile.write(bytes(text, "UTF-8"))
解决这个问题,尽管我不太确定是否会再次引入编码(解码?)问题(还有其他要探索的格式问题)。 - bauerandrewstr
,在2.7中别名为bytes
,在3.x中完全重命名)并写入字节对象。不需要进行任何转换。 - Kevin