【发布时间】: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']]
【问题讨论】:
-
如果某些东西适用于列表理解,那么它也适用于列表。两者之间的区别在于列表推导为工作表中的每一行创建一个列表。如果您想在解决方案中执行此操作,您需要为每一行创建一个新列表并将其附加到结果中。但是,没有理由不使用列表推导来执行此操作。