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