Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 9, 2008 06:19:56

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

Задача такая - нужно нафаршировать массив (список списков в данном случае) данными из csv файла, попутно перекодировав их из cp1252 в юникод. Сделать-то я это сделал, но через одно место. Можно ли как-то облагородить код, сделать его более понятным, читаемым, лаконичным? Вдобавок, документация к csv модулю куцая, кто-нибудь знает, что за аргумент “rb”?

import csv
MyRow = []
MyList = []
reader = csv.reader(open("data.csv", "rb"), delimiter=';')
for x in reader:
	for y in range(len(x)):
		value = unicode(x[y], 'cp1251')
		MyRow.append(value)
	MyList.append(MyRow)
	MyRow = []



Отредактировано (Апрель 9, 2008 06:21:18)

Офлайн

#2 Апрель 9, 2008 08:44:19

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

1) open(“data.csv”, “rb”) к csv не имеет прямого отношения, это же стандартная функция питона, открывающая файл, а “rb” - это режим чтения бинарных файлов.

2)

import csv

MyList =

reader = csv.reader(open(“data.csv”, “rb”), delimiter=';')

for x in reader:
MyRow =
for y in x:
MyRow.append(unicode(y, ‘cp1251’))
MyList.append(MyRow)


не проверял:(



Офлайн

#3 Апрель 9, 2008 09:28:33

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

1) open(“data.csv”, “rb”) к csv не имеет прямого отношения, это же стандартная функция питона, открывающая файл, а “rb” - это режим чтения бинарных файлов.
А, вон оно что! А то я в спешке копипастнул код из примера, а там оказывается стандартная функция встроилась.
Второй вопрос остается открытым )). Код мне решительно не нравится - он хоть и не громоздкий, но читается и разбирается тяжело. Вложенные циклы - это зло (неизбежное ли?).



Отредактировано (Апрель 9, 2008 09:29:32)

Офлайн

#4 Апрель 9, 2008 10:22:28

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

Ну разве что замаскировать вложенный цикл ;)

import csv
reader = csv.reader(open("data.csv", "rb"), delimiter=';')   
MyList = [map(lambda x: unicode(x, 'cp1251'), x) for x in reader]
или в одном стиле, но менее читаемо:
MyList = map(lambda x: map(lambda y: unicode(y, 'cp1251'), x), reader)

Кстати, именовать переменные с большой буквы некошерно



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Апрель 9, 2008 10:31:12)

Офлайн

#5 Апрель 9, 2008 11:12:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

Еще можно читать документацию :)
import codecs, csv

r = csv.reader(codecs.open(filename “rb”, “cp1251”), delimiter=',')

а дальше с правильным csv reader делать все, что хочется.



Офлайн

#6 Апрель 9, 2008 13:07:23

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

r = csv.reader(codecs.open(filename “rb”, “cp1251”), delimiter=',')
Вот это очень кстати, не знал. Декодирование на лету полезная штука.

А с лямбдой тоже интересно, хотя я её еще не успел освоить.



Отредактировано (Апрель 9, 2008 13:09:27)

Офлайн

#7 Апрель 10, 2008 23:28:04

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"

Teddy Bear
А с лямбдой тоже интересно, хотя я её еще не успел освоить.
Вот здесь есть пара примеров использования.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version