python-在列

时间:2018-07-31 19:04:29

标签: python pandas csv encoding mojibake

我正在尝试浏览最近发布的Russion调查推文数据库。 9个CSV文件中的第一个: https://raw.githubusercontent.com/fivethirtyeight/russian-troll-tweets/master/IRAhandle_tweets_1.csv

数据集的“内容”列包含推文内容。推文有50多种语言。

有什么方法可以读取至少一个拉丁+西里尔文推文正确显示在同一数据集中的编码的.csv?

我尝试用UTF-8和cp1251尝试pd.read_csv,但到目前为止没有成功。拉丁推文显示正确,西里尔字母显示-否。

例如,文件中的第372行(作为二进制文件读取)具有以下值:

(b'2528776985,1488REASONS,"\xc3\x90\xc2\x9f\xc3\x91\xc2\x80\xc3\x90\xc2\xb8'
 b'\xc3\x91\xc2\x87\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0 #67'
 b' \xc3\x90\xc2\x9c\xc3\x91\xc2\x83\xc3\x91\xc2\x82\xc3\x90\xc2'
 b'\xba\xc3\x90\xc2\xbe: \xc3\x82\xc2\xab\xc3\x90\xc2\x97\xc3\x90\xc2\xb5\xc3'
 b'\x90\xc2\xbd\xc3\x90\xc2\xb8\xc3\x91\xc2\x82-\xc3\x90\xc2\x90'
 b'\xc3\x91\xc2\x80\xc3\x90\xc2\xb5\xc3\x90\xc2\xbd\xc3\x90\xc2\xb5'
 b'\xc3\x82\xc2\xbb \xc3\x90\xc2\xb4\xc3\x90\xc2\xbb\xc3\x91\xc2\x8f \xc3\x90'
 b'\xc2\xb0\xc3\x90\xc2\xb4\xc3\x90\xc2\xb0\xc3\x90\xc2\xbf\xc3\x91'
 b'\xc2\x82\xc3\x90\xc2\xb0\xc3\x91\xc2\x86\xc3\x90\xc2\xb8\xc3\x90'
 b'\xc2\xb8 \xc3\x90\xc2\xba \xc3\x90\xc2\xa7\xc3\x90\xc2\x9c \xc3\x90\xc2'
 b'\xbf\xc3\x90\xc2\xbe\xc3\x91\xc2\x82\xc3\x91\xc2\x80\xc3\x90\xc2'
 b'\xb5\xc3\x90\xc2\xb1\xc3\x91\xc2\x83\xc3\x90\xc2\xb5\xc3\x91\xc2'
 b'\x82\xc3\x91\xc2\x81\xc3\x91\xc2\x8f 1,5\xc3\xa2\xc2\x80\xc2\x932'
 b' \xc3\x90\xc2\xbc\xc3\x90\xc2\xbb\xc3\x91\xc2\x80\xc3\x90\xc2\xb4 \xc3\x91'
 b'\xc2\x80\xc3\x91\xc2\x83\xc3\x90\xc2\xb1\xc3\x90\xc2\xbb\xc3\x90'
 b'\xc2\xb5\xc3\x90\xc2\xb9",Unknown,Russian,1/19/2017 13:07,1/19/2017 13:07,'
 b'6311,6313,1806,,Russian,0,0,NonEnglish\r\n')

因此,当解码为UTF-8时,content值变为:

('Ð\x9fÑ\x80иÑ\x87ина #67 Ð\x9cÑ\x83Ñ\x82ко: '
 '«Ð\x97ениÑ\x82-Ð\x90Ñ\x80ене» длÑ\x8f адапÑ\x82аÑ\x86ии к '
 'ЧÐ\x9c поÑ\x82Ñ\x80ебÑ\x83еÑ\x82Ñ\x81Ñ\x8f 1,5â\x80\x932 млÑ\x80д '
 'Ñ\x80Ñ\x83блей')

打印为

ÐÑиÑина #67 ÐÑÑко: «ÐениÑ-ÐÑене» Ð´Ð»Ñ Ð°Ð´Ð°Ð¿ÑаÑии к ЧРпоÑÑебÑеÑÑÑ 1,5â2 млÑд ÑÑблей

1 个答案:

答案 0 :(得分:4)

注意:数据集has now been fixed,不再需要转换。下面的答案不再适用。


数据集包含Mojibake data(已被两次 编码的数据)。首先是UTF-8,然后被视为字节,然后再次编码为UTF-8

您可以通过以下方式解决此问题:首先对Latin-1进行编码,以将Unicode文本中的UTF-8代码点映射回字节,然后再次将其解码为UTF-8:

content.encode('latin1').decode('utf8')

演示:

>>> content.encode('latin1').decode('utf8')
'Причина #67 Мутко: «Зенит-Арене» для адаптации к ЧМ потребуется 1,5–2 млрд рублей'
>>> print(content.encode('latin1').decode('utf8'))
Причина #67 Мутко: «Зенит-Арене» для адаптации к ЧМ потребуется 1,5–2 млрд рублей

您可以将此转换应用于Pandas数据框中的整个列:

df.content = df.content.str.encode('latin1').str.decode('utf8')

演示:

>>> import pandas as pd
>>> df = pd.read_csv('https://raw.githubusercontent.com/fivethirtyeight/russian-troll-tweets/master/IRAhandle_tweets_1.csv', encoding='utf8')
>>> df.iloc[372].content
'Ð\x9fÑ\x80иÑ\x87ина #67 Ð\x9cÑ\x83Ñ\x82ко: «Ð\x97ениÑ\x82-Ð\x90Ñ\x80ене» длÑ\x8f адапÑ\x82аÑ\x86ии к ЧÐ\x9c поÑ\x82Ñ\x80ебÑ\x83еÑ\x82Ñ\x81Ñ\x8f 1,5â\x80\x932 млÑ\x80д Ñ\x80Ñ\x83блей'
>>> df.content = df.content.str.encode('latin1').str.decode('utf8')
>>> df.iloc[372].content
'Причина #67 Мутко: «Зенит-Арене» для адаптации к ЧМ потребуется 1,5–2 млрд рублей'

我已经filed an issue with the project来固定编码。