python - 读取列中包含多种语言的 .csv

python - Reading a .csv with multiple languages in column

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

数据集有一列 "content" 包含推文内容。推文支持 50 多种语言。

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

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

例如,文件中的第 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 млÑд ÑÑблей

注:数据集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修复了编码。