Какой самый простой способ исправить существующий CSV Unicode UTF-8 без BOM-файла не отображается правильно в Excel? - PullRequest
0 голосов
/ 13 января 2020

У меня есть задача конвертировать CSV-файл utf-8 в файл Excel, но в Excel он не читается должным образом. Поскольку в начале файла не было метки порядка следования байтов (BOM)
Я вижу, как: { ссылка }

    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'中国人'])


Но похоже, что это работает только с новыми файлами.
Но не работает для моего файла уже есть данные.
Есть ли какие-нибудь простые способы поделиться?

Есть ли другой способ, кроме этого? : { ссылка }

  1. Сохранить экспортированный файл в формате csv
  2. Открыть Excel
  3. Импортировать данные с помощью Data-- > Импорт внешних данных -> Импорт данных
  4. Выберите тип файла "csv" и перейдите к файлу
  5. В мастере импорта измените File_Origin на "65001 UTF" (или выберите правильный символ языка)
  6. Измените разделитель на запятую
  7. Выберите место для импорта и Fini sh

Ответы [ 2 ]

1 голос
/ 13 января 2020

Прочитайте файл и запишите его обратно в нужной кодировке:

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 код c удалит спецификацию, если она присутствует при чтении, и добавит спецификацию при записи, поэтому Выше можно безопасно запускать файлы с оригинальной спецификацией или без нее.

Вы можете выполнить конвертацию на месте, выполнив:

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 также работает. Некоторые старые Excels неправильно обрабатывают UTF-8.

0 голосов
/ 14 января 2020

Спасибо!
Я нашел способ автоматически обрабатывать недостающую подпись utf-8 спецификации. Помимо отсутствия подписи спецификации, существует еще одна проблема, заключающаяся в том, что дублирующаяся подпись спецификации смешивается в данных файла. Excel не показывает четко и прозрачно. и ошибиться в других данных при сравнении, рассчитать. Например:
data -> Excel
Chineseï »¿-> Chinese
1ï» ¿2 -> 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, 美国人
...