2016-05-16 2 views
1

У меня довольно большая база данных (10 000+ записей с примерно 120 vars каждый) в R. Проблема состоит в том, что около половины переменных в исходном CSV-файле были правильно закодированы в UTF-8 в то время как остальные были закодированы в ANSI (Windows-1252), но декодируются как UTF-8, что приводит к странным символам для символов, отличных от ASCII (в основном латинских), таких как é или ó.Смешанное кодирование в файле csv

Я не могу просто изменить кодировку файла, потому что половина ее будет декодирована с неправильным типом. Кроме того, у меня нет способа узнать, какие столбцы были закодированы правильно, а какие - нет, и все, что у меня есть, это оригинальный CSV-файл, который я пытаюсь исправить.

До сих пор я обнаружил, что простой текстовый файл может быть закодирован в UTF-8 и могут быть выведены неверно истолкованные символы (плохой Юникод). Одна библиотека, которая предоставляет такую ​​функциональность, - ftfy для Python. Тем не менее, я использую следующий код и до сих пор, не имели успеха:

import ftfy 

file = open("file.csv", "r", encoding = "UTF8") 
content = file.read() 

content = ftfy.fix_text(content) 

Однако content покажет точно такой же текст, чем раньше. Я считаю, что это связано с тем, как ftfy выводит кодировку содержимого.

Тем не менее, если я бегу ftfy.fix_text("Pública que cotiza en México") он покажет правильный ответ:

>> 'Pública que cotiza en México' 

Я думаю, что, возможно, способ решения этой проблемы заключается в перебирать каждого из значений (ячеек) в. csv-файл и попытаться исправить, если с ftfy, и импортировать файл обратно в R, но он кажется немного сложным

Любые предложения?

+1

Если файл был смешанным, а вы используете UTF-8, вы получите ошибки UnicodeDecode повсюду. Это похоже на то, что символы были неправильно записаны в БД. Используйте ftfy, как было предложено. Возможно, напишите обертку вокруг модуля CSV для анализа через ftfy перед возвратом результата –

ответ

2

Фактически, было смешанное кодирование случайных ячеек в нескольких мест. Вероятно, возникла проблема при экспорте данных из исходного источника.

Проблема с ftfy заключается в том, что он обрабатывает файл по строкам, и если он встречается с хорошо сформированными символами, он предполагает, что вся строка закодирована одинаково и что странные символы были предназначены.

Поскольку эти ошибки возникли случайным образом во всем файле, я не смог перенести всю таблицу и обработать каждую строку (столбец), поэтому ответ заключался в обработке ячейки по ячейке. К счастью, у Python есть стандартная библиотека, которая обеспечивает функциональность безболезненно работать с csv (особенно потому, что она правильно экранирует ячейки).

Это код, который я использовал для обработки файла:

import csv 
import ftfy 
import sys 

def main(argv): 
    # input file 
    csvfile = open(argv[1], "r", encoding = "UTF8") 
    reader = csv.DictReader(csvfile) 

    # output stream 
    outfile = open(argv[2], "w", encoding = "Windows-1252") # Windows doesn't like utf8 
    writer = csv.DictWriter(outfile, fieldnames = reader.fieldnames, lineterminator = "\n") 

    # clean values 
    writer.writeheader() 
    for row in reader: 
     for col in row: 
      row[col] = ftfy.fix_text(row[col]) 
     writer.writerow(row) 

    # close files 
    csvfile.close() 
    outfile.close() 

if __name__ == "__main__": 
    main(sys.argv) 

И потом, называя:

$ python fix_encoding.py data.csv out.csv 

будет выводить CSV-файл с правом кодирования.

+0

Хорошее решение.Хотя мне было проще использовать csv.reader и csv.writer, так как вам не нужно иметь дело с заголовками, словарями и т. Д. – AlexanderMP

1

небольшое предложение: разделите и победителю. попробуйте использовать один инструмент (ftfy?), Чтобы выровнять весь файл с тем же кодированием (и сохранить в виде файла открытого текста), и только затем попытайтесь разобрать его как csv

Смежные вопросы