Форум сайта python.su
Помогите новичку!
Обрабатываю большой txt - файл. Вот код:
# coding: utf8
file = open('_Origin.txt')
supplier = {}
for i in range(1,50000):
line = file.readline()
key = line.split(';')
if key in supplier :
tmp = supplier.get(key)
supplier.update({key:tmp + 1})
else:
supplier.update({key:1})
print (supplier)
Обрабатывает примерно 45000 строк и выдает ошибку:
Traceback (most recent call last):
……, line 7, in <module>
line = file.readline()
File “C:\Python33\lib\encodings\cp1251.py”, line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 479: character maps to <undefined>
Почему??
Офлайн
Вообще непонятно, как эта программа может что-то обрабатывать.
Если внимательно присмотреться, то можно понять, что ключем является то, что возвращает функция
key = line.split(';')
for i in range(1,50000): line = file.readline()
for line in file: print line
if key in supplier : tmp = supplier.get(key) supplier.update({key:tmp + 1}) else: supplier.update({key:1})
supplier[key] = supplier.setdefault(key, 0) + 1
Отредактировано 4kpt (Сен. 14, 2013 23:56:47)
Офлайн
Сорри!
# coding: utf8
file = open('_Origin.txt')
supplier = {}
for i in range(1,50000):
line = file.readline()
key = line.split(';')[1]
if key in supplier :
tmp = supplier.get(key)
supplier.update({key:tmp + 1})
else:
supplier.update({key:1})
print (supplier)
Офлайн
Может написано и не совсем правильно. Но она как-то работает. Но только до строки 43481.
Если верхнюю границу цикла задать 43482:
for i in range(1,43482)
то выдаст вышеуказанную ошибку.
Офлайн
4kpt - С Вашей поправкой получилось вот так:
# coding: utf8
file = open('_Origin.txt')
supplier = {}
for i in range(1,50000):
line = file.readline()
key = line.split(';')[1]
supplier[key] = supplier.setdefault(key, 0) + 1
print (supplier)
Офлайн
#-*- coding: utf8 -*- from itertools import imap, ifilter def reducer(a, b): a[b] = a.setdefault(b, 0) + 1 return a with open('_Origin.txt') as fd: keys = imap(lambda a: a.split(';')[1], ifilter(None, imap(str.strip, fd))) print reduce(reducer, keys, {})
Офлайн
Спасибо всем кто откликнулся!
s0rg - Вы дали решение для версии 2.7 - отлично, все работает!
Не сказал изначально что я пробовал для версии 3.3
А почему для тройки не работает?
Офлайн
Для 3+
#-*- coding: utf8 -*- from itertools import imap, ifilter from functools import reduce def reducer(a, b): a[b] = a.setdefault(b, 0) + 1 return a with open('_Origin.txt') as fd: keys = imap(lambda a: a.split(';')[1], ifilter(None, imap(str.strip, fd))) print(reduce(reducer, keys, {}))
Офлайн