Найти - Пользователи
Полная версия: Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"
Начало » Python для экспертов » Нехитрый код (импорт сsv) работает, но он грубый, хочу "облагородить"
1
Teddy Bear
Задача такая - нужно нафаршировать массив (список списков в данном случае) данными из 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 = []
poltergeist
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)


не проверял:(
Teddy Bear
1) open(“data.csv”, “rb”) к csv не имеет прямого отношения, это же стандартная функция питона, открывающая файл, а “rb” - это режим чтения бинарных файлов.
А, вон оно что! А то я в спешке копипастнул код из примера, а там оказывается стандартная функция встроилась.
Второй вопрос остается открытым )). Код мне решительно не нравится - он хоть и не громоздкий, но читается и разбирается тяжело. Вложенные циклы - это зло (неизбежное ли?).
PooH
Ну разве что замаскировать вложенный цикл ;)
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)

Кстати, именовать переменные с большой буквы некошерно
Андрей Светлов
Еще можно читать документацию :)
import codecs, csv

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

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

А с лямбдой тоже интересно, хотя я её еще не успел освоить.
ZZZ
Teddy Bear
А с лямбдой тоже интересно, хотя я её еще не успел освоить.
Вот здесь есть пара примеров использования.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB