Python кодировка: UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 149: character maps to <undefined>

Иван

Открываю csv файл, выдается ошибка:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 149: character maps to

Код:

import requests
import os

def to_str(lines):
    for i in range(len(lines)):
        lines[i] = str(lines[i], 'utf-8')+'\n'
    return lines

database = open('database.csv')

import csv

reader = csv.DictReader(database)
reader.fieldnames[0] = 'lineno'
data = list(reader)

from pprint import pprint as pp
pp(database[:2])
pp(database[-2:])
1 ответ

Иван

По умолчанию open() на Питоне 3 использует locale.getpreferredencoding(False) кодировку (к примеру, cp1251 на русской Винде). Чтобы прочитать файл, закодированный в utf-8, необходимо явно кодировку передать:

#!/usr/bin/env python3
import csv

with open('database.csv', encoding='utf-8', newline='') as file:
    reader = csv.DictReader(file)
    rows = list(reader)

newline='' необходима, чтобы отключить замену новых строк (universal newlines mode), так как csv самостоятельно концы строк обрабатывает.

licensed under cc by-sa 3.0 with attribution.