Панды не могут загрузить данные, тайна кодировки CSV
Я пытаюсь загрузить набор данных в панды и, кажется, не могу пройти шаг 1. Я новичок, поэтому, пожалуйста, простите, если это очевидно, я искал предыдущие темы и не нашел ответа. Данные в основном на китайских иероглифах, что может быть проблемой.
.Csv очень большой, и его можно найти здесь: http://weiboscope.jmsc.hku.hk/datazip/ я пытаюсь на 1-й неделе.
В моем коде ниже я идентифицирую 3 типа декодирования, которые я пытался, включая попытку увидеть, какая кодировка использовалась
import pandas
import chardet
import os
#this is what I tried to start
data = pandas.read_csv('week1.csv', encoding="utf-8")
#spits out error: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9a in position 69: invalid start byte
#Code to check encoding -- this spits out ascii
bytes = min(32, os.path.getsize('week1.csv'))
raw = open('week1.csv', 'rb').read(bytes)
chardet.detect(raw)
#so i tried this! it also fails, which isn't that surprising since i don't know how you'd do chinese chars in ascii anyway
data = pandas.read_csv('week1.csv', encoding="ascii")
#spits out error: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
#for god knows what reason this allows me to load data into pandas, but definitely not correct encoding because when I print out first 5 lines its gibberish instead of Chinese chars
data = pandas.read_csv('week1.csv', encoding="latin1")
Любая помощь будет принята с благодарностью!
РЕДАКТИРОВАТЬ: Ответ, предоставленный @Kristof на самом деле работает, как и программа, которую мой коллега написал вчера:
import csv
import pandas as pd
def clean_weiboscope(file, nrows=0):
res = []
with open(file, 'r', encoding='utf-8', errors='ignore') as f:
reader = csv.reader(f)
for i, row in enumerate(f):
row = row.replace('\n', '')
if nrows > 0 and i > nrows:
break
if i == 0:
headers = row.split(',')
else:
res.append(tuple(row.split(',')))
df = pd.DataFrame(res)
return df
my_df = clean_weiboscope('week1.csv', nrows=0)
Я также хотел добавить для будущих поисковиков, что это открытые данные Weiboscope за 2012 год.
1 ответ
Кажется, что-то очень не так с входным файлом. Повсюду ошибки кодирования.
Одна вещь, которую вы могли бы сделать, это прочитать CSV-файл как двоичный файл, декодировать двоичную строку и заменить ошибочные символы.
Пример ( исходный код для чтения чанка):
in_filename = 'week1.csv'
out_filename = 'repaired.csv'
from functools import partial
chunksize = 100*1024*1024 # read 100MB at a time
# Decode with UTF-8 and replace errors with "?"
with open(in_filename, 'rb') as in_file:
with open(out_filename, 'w') as out_file:
for byte_fragment in iter(partial(in_file.read, chunksize), b''):
out_file.write(byte_fragment.decode(encoding='utf_8', errors='replace'))
# Now read the repaired file into a dataframe
import pandas as pd
df = pd.read_csv(out_filename)
df.shape
>> (4790108, 11)
df.head()