Ferroman
Июль 17, 2008 02:29:09
Уфф.
Пока Вы не найдёте что такое итератор в питоне, как правильно объявлять класс и его наследовать, я ничем помочь не смогу.
Для этого нужно поискать в гуле и походить по ссылкам в прикреплённой теме. Времени это должно забрать немного, особенно если Вы знакомы с Си.
Делать за Вас я не буду. Покажите Ваши изыскания (и, желательно, с комментариями), и если будут ошибки/недочёты/непонимание с удовольствием помогу.
Michael_2
Июль 17, 2008 14:16:19
ну вот, что-то сделал
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
ZAN
Июль 17, 2008 14:26:28
Michael_2, в тот момент, когда нужно остановить итерации, нужно в методе next генерировать исключение -> raise StopIteration.
А выводит None, очевидно, потому, что self.reader не содержит элементов.
Michael_2
Июль 17, 2008 14:29:02
это я понимаю. Только не знаю, как это записать. Помогите, пожалуйста. Очень надо
Michael_2
Июль 17, 2008 15:54:07
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 строку
ZAN
Июль 17, 2008 15:56:53
Например так (
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
Michael_2
Июль 17, 2008 16:04:12
Так а как этот 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
Ferroman
Июль 17, 2008 16:37:54
1. Пожалуйста, обрамляйте код в
тег “code”2. Вы зря переделали код, предыдущий вариант был правильнее
3. Не надо прогонять весь цикл каждый раз когда вызываться метод next. Нужно брать следующее значение итератора, который возвращает DictReader.
Следующее значение выдаёт метод next (в данном случае - self.reader.next())
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader
Michael_2
Июль 17, 2008 17:01:22
а что теперь неправильно?
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, то как быть?
Ferroman
Июль 17, 2008 17:16:22
Невиполнено два пункта:
2. Вы зря переделали код, предыдущий вариант был правильнее
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader