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修复了编码。
我正在尝试探索最近发布的 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修复了编码。