Просмотр значений строк в openpyxl

в модуле csv в python есть функция под названием csv.reader что позволяет перебирать строки, возвращает объект reader и может храниться в контейнере, как список.

поэтому, когда список присваивается переменной и печатается, т. е.:

csv_rows = list(csv.reader(csvfile, delimiter=',', quotechar='|'))
print (csv_rows)
>
>
>
[['First Name', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'] # I gave an example of the function outputting a header row

до сих пор я не вижу подобной функции в openpyxl. Я могу ошибаться, поэтому мне интересно, может ли кто-нибудь из вас помочь мне.

обновление

@alecxe, ваш решение работает отлично (за исключением его приведения моей даты рождения в формате datetime вместо обычной строки).

def iter_rows(ws):
for row in ws.iter_rows():
    yield [cell.value for cell in row]
>
>
>>> pprint(list(iter_rows(ws)))
[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'], ['John', 'Smith', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]

поскольку я новичок, я хотел знать, как это будет работать, если я использую цикл for вместо понимания списка.

поэтому я использовал это:

def iter_rows(ws):
result=[]
for row in ws.iter_rows()
    for cell in row:
        result.append(cell.value)
yield result

Это почти дает мне точно такой же выход, вместо этого он дает мне это: Как вы можете сказать, это по существу дает мне один гигантский список вместо вложенного списка в результате вы дать мне.

>>>print(list(iter_rows(ws)))

[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex', 'David', 'Yao', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]

2 ответов


iter_rows() наверное, похожее чувство:

возвращает квадратный диапазон на основе параметра range_string, используя генераторы. Если диапазон не передается, будет выполняться итерация по всем ячейкам в лист

>>> from openpyxl import load_workbook
>>> 
>>> wb = load_workbook('test.xlsx')
>>> ws = wb.get_sheet_by_name('Sheet1')
>>> 
>>> pprint(list(ws.iter_rows()))
[(<Cell Sheet1.A1>,
  <Cell Sheet1.B1>,
  <Cell Sheet1.C1>,
  <Cell Sheet1.D1>,
  <Cell Sheet1.E1>),
 (<Cell Sheet1.A2>,
  <Cell Sheet1.B2>,
  <Cell Sheet1.C2>,
  <Cell Sheet1.D2>,
  <Cell Sheet1.E2>),
 (<Cell Sheet1.A3>,
  <Cell Sheet1.B3>,
  <Cell Sheet1.C3>,
  <Cell Sheet1.D3>,
  <Cell Sheet1.E3>)]

вы можете немного изменить его, чтобы получить список значений строк, например:

def iter_rows(ws):
    for row in ws.iter_rows():
        yield [cell.value for cell in row]

демо:

>>> pprint(list(iter_rows(ws)))
[[1.0, 1.0, 1.0, None, None],
 [2.0, 2.0, 2.0, None, None],
 [3.0, 3.0, 3.0, None, None]]

я получил его для работы с помощью этого метода:

all_rows = []

for row in worksheet:
    current_row = []
    for cell in row:
        current_row.append(cell.value)
    all_rows.append(current_row)

по сути, я создал список для всех данных. Затем я повторил каждую строку на листе. Каждый cell.value внутри строки был добавлен в краткосрочный список (текущая строка). Однажды все cell.values внутри строки добавляются в краткосрочный список, краткосрочный список добавляется в долгосрочный список.