Читать очень большой файл SPSS со специальными символами в панд - PullRequest
0 голосов
/ 19 октября 2018

У меня есть файл SPSS (.sav) с более чем 90000 столбцов и около 1800 строк.Ранее я использовал приведенный ниже код (взят из этого ответа ), который хорошо работал.

raw_data = spss.SavReader('largefile.sav', returnHeader = True)
raw_data_list = list(raw_data)
data = pd.DataFrame(raw_data_list)
data = data.rename(columns=data.loc[0]).iloc[1:]

Однако теперь некоторые столбцы содержат специальные символы (в том числе китайские символы и ударения).персонажи).Используя документацию , кажется, что использование ioUtf8=True с SavReader должно достичь того, что я собираюсь сделать.Поэтому я делаю следующее:

raw_data = spss.SavReader('largefile.sav', returnHeader = True, ioUtf8=True)
raw_data_list = list(raw_data)
data = pd.DataFrame(raw_data_list)
data = data.rename(columns=data.loc[0]).iloc[1:]

Строка 1 работает нормально, но строка 2 возвращает следующую ошибку:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 6: invalid continuation byte

Как обойти проблему?

1 Ответ

0 голосов
/ 19 октября 2018

Похоже, есть символы, закодированные в вашем наборе данных, которые не могут быть декодированы с помощью UTF-8.А именно, «а», закодированный латинским-1.

c = 'à'

print c.decode('utf-8')

>>> UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: unexpected end of data

print c.decode('latin-1')

>>> à

Вы можете попытаться сохранить свой набор данных в формате Unicode, если он еще не Unicode (сделайте резервную копию, прежде чем сделать это, на всякий случай).Попробуйте следующее: Откройте SPSS без открытых данных, введите

set unicode on. 

, откройте свой набор данных и сохраните его.Теперь он должен быть в формате Unicode.Теперь попробуйте запустить код для импорта данных.

*** Обновление

Вы можете попытаться читать файлы по строкам и обрабатывать ошибки по мере их появления:

rawdata = []
with SavReader('largefile.sav', ioUtf8=True) as reader:
    for record in reader:
        try:
            rawdata.append(record)
        except UnicodeDecodeError:
            r = record.decode('latin-1')
            rawdata.append(r.encode('utf-8'))                
 data = pd.DataFrame(raw_data_list)
 data = data.rename(columns=data.loc[0]).iloc[1:]

Поскольку у вас есть китайские символы, такие какдля этого вам, возможно, придется добавить еще один блок try: except:, если добавление их в список необработанных данных также приведет к ошибке.

...