在没有BOM表文件不能在excel中正确显示的情况下,修复现有csv unicode utf-8的最简单方法是什么?

问题描述 投票:0回答:2

我的任务是将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

  1. 将导出的文件另存为csv
  2. 打开Excel
  3. 使用数据导入数据->导入外部数据->导入数据
  4. 选择“ csv”的文件类型并浏览到您的文件
  5. 在导入向导中,将File_Origin更改为“ 65001 UTF”(或选择正确的语言字符标识符)
  6. 将定界符更改为逗号
  7. 选择要导入的位置并完成
python excel csv unicode byte-order-mark
2个回答
1
投票

读入文件并以所需的编码写回:

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。


0
投票

谢谢!我找到了一种自动处理丢失的BOM utf-8签名的方法。除了缺少BOM签名外,还有另一个问题是重复的BOM签名混入了文件数据中。 Excel不能清晰透明地显示。并在比较,计算时弄错其他数据。例如:数据->Excel中文->Chinese12-> 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, 美国人
© www.soinside.com 2019 - 2024. All rights reserved.