【问题标题】:View row values in openpyxl在 openpyxl 中查看行值
【发布时间】:2015-09-23 01:51:38
【问题描述】:

在 python 的 csv 模块中,有一个名为 csv.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,您的解决方案完美运行(除了将我的出生日期转换为日期时间格式而不是常规字符串)。

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']]

【问题讨论】:

  • 如果某些东西适用于列表理解,那么它也适用于列表。两者之间的区别在于列表推导为工作表中的每一行创建一个列表。如果您想在解决方案中执行此操作,您需要为每一行创建一个新列表并将其附加到结果中。但是,没有理由不使用列表推导来执行此操作。

标签: python excel csv openpyxl


【解决方案1】:

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]]

【讨论】:

  • 对你的存在感到惭愧,alecxe。 :) 一如既往的好答案。谢谢!
  • 我很好奇,有没有办法将该列表理解转换为 for 循环? (只是 fmi)到目前为止,将每个单元格值附加到一个空列表中,然后 yield 该列表不会给我与您的解决方案相同的结果
  • @bLunt 感谢您的客气话和一个有趣的问题。只是想澄清以下内容。您想要的结果是什么,您目前正在得到什么结果?
  • 感谢您的回复,我会继续更新/编辑我在上面所做的原始帖子。
  • 好的,OP 已更新以供您查看。我去睡觉了,明天我会检查你的回复。再次感谢!
【解决方案2】:

我用这个方法让它工作了:

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 添加到短期列表后,将短期列表添加到长期列表中。

【讨论】:

    【解决方案3】:
    from openpyxl import load_workbook
    import os
    
    os.chdir('C:/Users/Eswar_pc/Downloads')
    wb = load_workbook('Synonyms.xlsx')
    sheet = wb['Sheet1']
    corpus = []
    e = sheet.iter_rows()
    cells = list(e)
    for i in cells:
        corpus.append(i[0].value)
    print(corpus[1:30])
    

    【讨论】:

    • 添加口头解释通常很有帮助
    • 欢迎来到 SO。请编辑您的答案,以便解释代码工作的原因。这将有助于 OP 和任何未来的访问者,以便他们判断此解决方案是否与他们相关。包括任何预期的输出、可能的问题以及它们可能出错的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多