我的任务是将utf-8 csv文件转换为excel文件,但是在excel中无法正确读取。因为在文件的开头没有字节顺序标记(BOM)我知道如何:https://stackoverflow.com/a/38025106/6102332
with open('test.csv', 'w', newline='', encoding='utf-8-sig') as f:
w = csv.writer(f)
# Write Unicode strings.
w.writerow([u'English', u'Chinese'])
w.writerow([u'American', u'美国人'])
w.writerow([u'Chinese', u'中国人'])
但这似乎仅适用于全新文件。但不适用于我的文件已包含数据。有什么简单的分享方法吗?
除此之外,还有其他方法吗? :https://stackoverflow.com/a/6488070/6102332
- 将导出的文件另存为csv
- 打开Excel
- 使用数据导入数据->导入外部数据->导入数据
- 选择“ csv”的文件类型并浏览到您的文件
- 在导入向导中,将File_Origin更改为“ 65001 UTF”(或选择正确的语言字符标识符)
- 将定界符更改为逗号
- 选择要导入的位置并完成
读入文件并以所需的编码写回:
with open('input.csv','r',encoding='utf-8-sig') as fin:
with open('output.csv','w',encoding='utf-8-sig') as fout:
fout.write(fin.read())
[utf-8-sig
编解码器将在读取时显示BOM,并在写入时添加BOM,因此以上内容可以安全地在最初具有或没有BOM的文件上运行。
您可以通过以下方式进行就地转换:
file = 'test.csv'
with open(file,'r',encoding='utf-8-sig') as f:
data = f.read()
with open(file,'w',encoding='utf-8-sig') as f:
f.write(data)
也请注意,utf16
也可以工作。一些较旧的Excel无法正确处理UTF-8。
谢谢!我找到了一种自动处理丢失的BOM utf-8签名的方法。除了缺少BOM签名外,还有另一个问题是重复的BOM签名混入了文件数据中。 Excel不能清晰透明地显示。并在比较,计算时弄错其他数据。例如:数据->Excel
中文->Chinese
12-> 12
[如果您进行比较,显然ChineseBOM将不等于中文。代码python解决了这个问题:
import codecs
bom_utf8 = codecs.BOM_UTF8
def fix_duplicate_bom_utf8(file, bom=bom_utf8):
with open(file, 'rb') as f:
data_f = f.read()
data_finish = bom + data_f.replace(bom, b'')
with open(file, 'wb') as f:
f.write(data_finish)
return
# Use:
file_csv = r"D:\data\d20200114.csv" # American, 美国人
fix_duplicate_bom_utf8(file_csv)
# file_csv -> American, 美国人