Python читает огромный файл построчно с кодировкой utf-8

Я хочу прочитать некоторые довольно большие файлы (если быть точным: набор данных google ngram 1 слово) и подсчитать, сколько раз встречается символ. Сейчас я написал этот скрипт:

import fileinput
files = ['../../datasets/googlebooks-eng-all-1gram-20090715-%i.csv' % value for value in range(0,9)]
charcounts = {}
lastfile = ''
for line in fileinput.input(files):
    line = line.strip()
    data = line.split('\t')
    for character in list(data[0]):
        if (not character in charcounts):
            charcounts[character] = 0
        charcounts[character] += int(data[1])
    if (fileinput.filename() is not lastfile):
        print(fileinput.filename())
        lastfile = fileinput.filename()
    if(fileinput.filelineno() % 100000 == 0):
        print(fileinput.filelineno())
print(charcounts)

который работает отлично, пока не доходит примерно до строки 700.000 первого файла, тогда я получаю эту ошибку:

../../datasets/googlebooks-eng-all-1gram-20090715-0.csv
100000
200000
300000
400000
500000
600000
700000
Traceback (most recent call last):
  File "charactercounter.py", line 5, in <module>
    for line in fileinput.input(files):
  File "C:\Python31\lib\fileinput.py", line 254, in __next__
    line = self.readline()
  File "C:\Python31\lib\fileinput.py", line 349, in readline
    self._buffer = self._file.readlines(self._bufsize)
  File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 7771: cha
racter maps to <undefined>

Чтобы решить эту проблему, я немного поискал в интернете и пришел к этому коду:

import fileinput
files = ['../../datasets/googlebooks-eng-all-1gram-20090715-%i.csv' % value for value in range(0,9)]
charcounts = {}
lastfile = ''
for line in fileinput.input(files,False,'',0,'r',fileinput.hook_encoded('utf-8')):
    line = line.strip()
    data = line.split('\t')
    for character in list(data[0]):
        if (not character in charcounts):
            charcounts[character] = 0
        charcounts[character] += int(data[1])
    if (fileinput.filename() is not lastfile):
        print(fileinput.filename())
        lastfile = fileinput.filename()
    if(fileinput.filelineno() % 100000 == 0):
        print(fileinput.filelineno())
print(charcounts)

но хук, который я сейчас использую, пытается прочитать весь файл размером 990 МБ в память сразу, что вроде как рушит мой компьютер. Кто-нибудь знает, как переписать этот код так, чтобы он действительно работал?

p.s: код еще даже не запущен до конца, так что я даже не знаю, делает ли он то, что должен, но для этого мне сначала нужно исправить эту ошибку.

О, и я использую Python 3.2

9
задан teuneboon 30 March 2011 в 22:11
поделиться