Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 14, 2013 21:30:39

Suhov99
Зарегистрирован: 2013-09-14
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Помогите новичку!
Обрабатываю большой 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>

Почему??

Офлайн

#2 Сен. 14, 2013 23:55:18

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Вообще непонятно, как эта программа может что-то обрабатывать.
Если внимательно присмотреться, то можно понять, что ключем является то, что возвращает функция

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

P.S. Понять в чем ошибка очень сложно ввиду отсутствия элементарных отступов. Все же лучше либо выставить отступы, либо обернуть код в теги.
+ Желательно дать хотя-бы кусочек файла для анализа…



Отредактировано 4kpt (Сен. 14, 2013 23:56:47)

Офлайн

#3 Сен. 15, 2013 07:46:05

Suhov99
Зарегистрирован: 2013-09-14
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Сорри!

# 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)


Вот фрагмент из файла:
DAEWOO;4350;AVST;96326208;решетка стеклоочистителя левая;413.8884;5;2-3;1;
DAEWOO;4350;AVST;96326304;замок лючка бензобака;87.5124;6;2-3;1;
DAEWOO;2350;LTA;96323350;КРЫШКА РЕЙЛИНГА КРЫШИ ЗАД ПРАВ МАТИЗ-2;90.7200;2;1-3;1;
DAEWOO;2350;LTA;96323355;ТЯГА АКТУАТОРА ДВЕРИ ПЕРЕДНЕЙ ЛЕВОЙ;14.8000;3;1-3;1;
DAEWOO;2350;LTA;96323356;ТЯГА АКТУАТОРА ДВЕРИ ПЕРЕДНЕЙ ПРАВОЙ;12.4000;3;1-3;1;
……………………………..

Задача функции просто посчитать количество строк с одинаковым содержимым второй секции.
Результат выдает вот в таком виде:
{'4350': 251, ‘2350’: 1119, …. и т.д.}
Т.е. ‘4350’ было обнаружено в 251 строке, ‘2350’ - в 1119 строках.

Офлайн

#4 Сен. 15, 2013 07:49:07

Suhov99
Зарегистрирован: 2013-09-14
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Может написано и не совсем правильно. Но она как-то работает. Но только до строки 43481.
Если верхнюю границу цикла задать 43482:

for i in range(1,43482)

то выдаст вышеуказанную ошибку.

Офлайн

#5 Сен. 15, 2013 07:54:04

Suhov99
Зарегистрирован: 2013-09-14
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

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)

Гораздо симпатичнее!

Но результат прежний… (

Офлайн

#6 Сен. 15, 2013 10:20:58

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

#-*- 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, {})

Офлайн

#7 Сен. 16, 2013 21:21:35

Suhov99
Зарегистрирован: 2013-09-14
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Спасибо всем кто откликнулся!
s0rg - Вы дали решение для версии 2.7 - отлично, все работает!
Не сказал изначально что я пробовал для версии 3.3
А почему для тройки не работает?

Офлайн

#8 Сен. 17, 2013 15:53:08

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Непонятная ошибка при обработке txt-файла

Для 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, {}))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version