在列中读取具有多种语言的.csv



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

数据集有一个列"content",其中包含推特内容。推特有50多种语言。

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

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

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

(b'2528776985,1488REASONS,"xc3x90xc2x9fxc3x91xc2x80xc3x90xc2xb8'
b'xc3x91xc2x87xc3x90xc2xb8xc3x90xc2xbdxc3x90xc2xb0 #67'
b' xc3x90xc2x9cxc3x91xc2x83xc3x91xc2x82xc3x90xc2'
b'xbaxc3x90xc2xbe: xc3x82xc2xabxc3x90xc2x97xc3x90xc2xb5xc3'
b'x90xc2xbdxc3x90xc2xb8xc3x91xc2x82-xc3x90xc2x90'
b'xc3x91xc2x80xc3x90xc2xb5xc3x90xc2xbdxc3x90xc2xb5'
b'xc3x82xc2xbb xc3x90xc2xb4xc3x90xc2xbbxc3x91xc2x8f xc3x90'
b'xc2xb0xc3x90xc2xb4xc3x90xc2xb0xc3x90xc2xbfxc3x91'
b'xc2x82xc3x90xc2xb0xc3x91xc2x86xc3x90xc2xb8xc3x90'
b'xc2xb8 xc3x90xc2xba xc3x90xc2xa7xc3x90xc2x9c xc3x90xc2'
b'xbfxc3x90xc2xbexc3x91xc2x82xc3x91xc2x80xc3x90xc2'
b'xb5xc3x90xc2xb1xc3x91xc2x83xc3x90xc2xb5xc3x91xc2'
b'x82xc3x91xc2x81xc3x91xc2x8f 1,5xc3xa2xc2x80xc2x932'
b' xc3x90xc2xbcxc3x90xc2xbbxc3x91xc2x80xc3x90xc2xb4 xc3x91'
b'xc2x80xc3x91xc2x83xc3x90xc2xb1xc3x90xc2xbbxc3x90'
b'xc2xb5xc3x90xc2xb9",Unknown,Russian,1/19/2017 13:07,1/19/2017 13:07,'
b'6311,6313,1806,,Russian,0,0,NonEnglishrn')

因此,当解码为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âx80x932 млÑx80д '
'Ñx80Ñx83блей')

打印为

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

注意:数据集现已修复,不再需要转换。以下答案不再适用。


数据集包含Mojibake数据,这些数据已被编码两次。首先是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âx80x932 млÑx80д Ñx80Ñx83блей'
>>> df.content = df.content.str.encode('latin1').str.decode('utf8')
>>> df.iloc[372].content
'Причина #67 Мутко: «Зенит-Арене» для адаптации к ЧМ потребуется 1,5–2 млрд рублей'

我已经向该项目提交了一个问题,以修复编码。

最新更新