Форум сайта python.su
Уфф.
Пока Вы не найдёте что такое итератор в питоне, как правильно объявлять класс и его наследовать, я ничем помочь не смогу.
Для этого нужно поискать в гуле и походить по ссылкам в прикреплённой теме. Времени это должно забрать немного, особенно если Вы знакомы с Си.
Делать за Вас я не буду. Покажите Ваши изыскания (и, желательно, с комментариями), и если будут ошибки/недочёты/непонимание с удовольствием помогу.
Офлайн
ну вот, что-то сделал
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
Офлайн
Michael_2, в тот момент, когда нужно остановить итерации, нужно в методе next генерировать исключение -> raise StopIteration.
А выводит None, очевидно, потому, что self.reader не содержит элементов.
Офлайн
это я понимаю. Только не знаю, как это записать. Помогите, пожалуйста. Очень надо
Офлайн
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 строку
Офлайн
Например так (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
Офлайн
Так а как этот 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)
Офлайн
1. Пожалуйста, обрамляйте код в тег “code”
2. Вы зря переделали код, предыдущий вариант был правильнее
3. Не надо прогонять весь цикл каждый раз когда вызываться метод next. Нужно брать следующее значение итератора, который возвращает DictReader.
Следующее значение выдаёт метод next (в данном случае - self.reader.next())
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader
Отредактировано (Июль 17, 2008 16:38:49)
Офлайн
а что теперь неправильно?
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
Офлайн
Невиполнено два пункта:
2. Вы зря переделали код, предыдущий вариант был правильнее
5. Генерировать исключение StopIteration как только закончатся элементы в self.reader
Офлайн