Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2008 02:29:09

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Класс для работы с csv

Уфф.
Пока Вы не найдёте что такое итератор в питоне, как правильно объявлять класс и его наследовать, я ничем помочь не смогу.
Для этого нужно поискать в гуле и походить по ссылкам в прикреплённой теме. Времени это должно забрать немного, особенно если Вы знакомы с Си.
Делать за Вас я не буду. Покажите Ваши изыскания (и, желательно, с комментариями), и если будут ошибки/недочёты/непонимание с удовольствием помогу.

Офлайн

#2 Июль 17, 2008 14:16:19

Michael_2
От:
Зарегистрирован: 2008-07-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для работы с csv

ну вот, что-то сделал
import csv
class CSV_Dumper:

def __init__(self, path, fields):
self.reader = csv.DictReader(open(path))
self._fields = fields
self._path = path

def __iter__(self):
return self

def next(self):
for row in self.reader:
temp_dict = {}
for field in self._fields:
temp_dict = row
return temp_dict

for i in CSV_Dumper(“c:\some.csv”, ):
print i

Только не пойму, как записать условие на StopIteration и почему выводит None



Офлайн

#3 Июль 17, 2008 14:26:28

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Класс для работы с csv

Michael_2, в тот момент, когда нужно остановить итерации, нужно в методе next генерировать исключение -> raise StopIteration.
А выводит None, очевидно, потому, что self.reader не содержит элементов.



Офлайн

#4 Июль 17, 2008 14:29:02

Michael_2
От:
Зарегистрирован: 2008-07-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для работы с csv

это я понимаю. Только не знаю, как это записать. Помогите, пожалуйста. Очень надо



Офлайн

#5 Июль 17, 2008 15:54:07

Michael_2
От:
Зарегистрирован: 2008-07-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для работы с csv

import csv

class Myiter:
def __init__(self, path, fields):
self.path = path
self.fields = fields


def __iter__(self):
return self

def next(self):

reader = csv.DictReader(open(self.path))
_fields = self.fields
for row in reader:
temp_dict = {}
for field in _fields:
temp_dict = row
return temp_dict

for i in Myiter('c:\some.csv',):
print i

Вот так сделал. Помогите пожалуйста записать StopIteration и как все таки сделать, чтобы выводило по полям. А то оно выводит бесконечно только 1 строку



Офлайн

#6 Июль 17, 2008 15:56:53

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Класс для работы с csv

Например так (http://docs.python.org/tut/node11.html#SECTION0011900000000000000000):

class Reverse:
"Iterator for looping over a sequence backwards"
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]

>>> for char in Reverse('spam'):
... print char
...
m
a
p
s



Офлайн

#7 Июль 17, 2008 16:04:12

Michael_2
От:
Зарегистрирован: 2008-07-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для работы с csv

Так а как этот StopIteration переложить на
def next(self):

reader = csv.DictReader(open(self.path))
_fields = self.fields
for row in reader:
temp_dict = {}
for field in _fields:
temp_dict = row
return temp_dict

что нужно проверять. Понятия не имею

вот сам метод. Как из него сделать метод next() ??

def printCSV(self, path, fields):

reader = csv.DictReader(open(path))
_fields = fields
for row in reader:
temp_dict = {}
for field in _fields:
temp_dict = row
print temp_dict



Отредактировано (Июль 17, 2008 16:05:29)

Офлайн

#8 Июль 17, 2008 16:37:54

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Класс для работы с csv

1. Пожалуйста, обрамляйте код в тег “code”
2. Вы зря переделали код, предыдущий вариант был правильнее
3. Не надо прогонять весь цикл каждый раз когда вызываться метод next. Нужно брать следующее значение итератора, который возвращает DictReader.
Следующее значение выдаёт метод next (в данном случае - self.reader.next())
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader

Отредактировано (Июль 17, 2008 16:38:49)

Офлайн

#9 Июль 17, 2008 17:01:22

Michael_2
От:
Зарегистрирован: 2008-07-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для работы с csv

а что теперь неправильно?

import csv 

class MyCSV:
def __init__(self, path, fields, delimiter):
self.path = path
self.fields = fields
self.delimiter = delimiter


def __iter__(self):
return self

def next(self):
reader = csv.DictReader(open(self.path))
_fields = self.fields
reader.next()
temp_dict = {}
for field in _fields:
temp_dict[field] = row[field]
print temp_dict
raise StopIteration



for i in MyCSV('c:\some.csv',['test1','test3'],','):
print i
если теперь нет row, то как быть?



Офлайн

#10 Июль 17, 2008 17:16:22

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Класс для работы с csv

Невиполнено два пункта:

2. Вы зря переделали код, предыдущий вариант был правильнее
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version