1

これが私のコードです。これを使用してExcelシートを開き、各行を文字列のリストとして返します(各セルは文字列です)。このクラスは、ファイル内の行と同じ数のリストで満たされた1つのリストを返します。したがって、50行は50個のリストを返します。

from xlrd import open_workbook

class ExcelReadLines(object):

    def __init__(self,path_to_file):
        '''Accepts the Excel File'''
        self.path_to_file = path_to_file
        self.__work__()


    def __work__(self):
        self.full_file_as_read_lines = []
        self.book = open_workbook(self.path_to_file)
        self.sheet = self.book.sheet_by_index(0)

        for row_index in range(self.sheet.nrows):
            single_read_lines = []
            for col_index in range(self.sheet.ncols):
                cell_value_as_string = str(self.sheet.cell(row_index,col_index).value)
                cell_value_stripped = cell_value_as_string.strip('u')
                single_read_lines.append(cell_value_stripped)
            self.full_file_as_read_lines.append(single_read_lines)

        return self.full_file_as_read_lines

しかし、私が実行すると:

for x in ExcelReader('excel_sheet'): print x

エラーメッセージが表示されます:

class is not iterable
4

4 に答える 4

7

クラスを反復可能にするには、__iter__メソッドが必要です。

検討:

class Foo(object):
    def __init__(self,lst):
        self.lst = lst
    def __iter__(self):
        return iter(self.lst)

例:

>>> class Foo(object):
...     def __init__(self,lst):
...         self.lst = lst
...     def __iter__(self):
...         return iter(self.lst)
... 
>>> Foo([1,2,3])
<__main__.Foo object at 0xe9890>
>>> for x in Foo([1,2,3]): print x
... 
1
2
3

あなたの例は、ジェネレーターとしては少し優れているようです-ここでクラスの必要性が本当にわかりません:

def excel_reader(path_to_file):
    book = open_workbook(path_to_file)
    sheet = book.sheet_by_index(0)

    for row_index in range(sheet.nrows):
        single_read_lines = []
        for col_index in range(sheet.ncols):
            cell_value_as_string = str(self.sheet.cell(row_index,col_index).value)
            cell_value_stripped = cell_value_as_string.strip('u')
            single_read_lines.append(cell_value_stripped)
        yield single_read_lines
于 2013-01-15T20:39:00.070 に答える
2

Python の特別な反復子メソッドの実装を検討する必要があります。

また、メソッドに名前を付けるべきではないことに注意してください。__work__これは、マジック メソッドの構文を使用していますが、実際には実際のマジック メソッドではないためです。

于 2013-01-15T20:40:23.217 に答える
1

ここでいくつかの問題があります。

  1. あなたのコードは何も返しません。呼び出します__work__が、値を返しません。

  2. たとえそうであったとしても、何かを返すこと__init__はオブジェクトをそのものにしないので、それは役に立ちません。

  3. とにかく、オブジェクトをリストにしたくありませんそれを反復したいだけです。

Python でイテレータを記述する方法の簡単な例については、この質問を参照してください。

さらに、__work__コードのようにアンダースコアを 2 つ挟んだ名前を使用しないでください。この種の名前は、慣例により Python 内部で使用するために予約されています。

于 2013-01-15T20:40:41.047 に答える
0

Unless I'm mistaken, what you're really after is

def first_sheet(fname):
    wb = xlrd.open_workbook(fname)
    ws = wb.sheet_by_index(0)
    for i in xrange(ws.nrows):
        yield ws.row_values(i) # maybe strip 'u''s - but that looks a bit sus... (probably something to do with your `str`)

list_of_rows = list(first_sheet('somefile.xls'))

Then do any transposition using zip if needs be...

于 2013-01-15T20:55:20.003 に答える