在使用 openpyxl 的 while 循环期间每次都无法在新行中写入列表
Having troubles to write list in a new row every time during while loop with openpyxl
每次代码循环时,我都遇到了将列表值插入新行的问题。
简而言之,我每次都需要代码,它循环将 lst
中的值每次写入单独的行。
我进行了广泛的研究以试图了解其工作原理并找到了大量示例,但不幸的是,我无法使代码按照这些示例工作。
这是代码:
max_value = 5
lst = []
while True:
wb = Workbook()
ws = wb.active
num = (max_value)
for n in range(num):
weight = float(input('Weight: '))
lst.append(weight)
ws.append(lst)
if n+1 == max_value:
wb.save(filename='path')
我试过在行 ws.append(lst)
之后添加 ws.insert_rows(idx=2, amount=1)
,如下所示:
...
ws.insert_rows(idx=2, amount=1)
ws.append(lst)
if n+1 == max_value:
wb.save(filename='path')
但它什么也没做,因为我想它需要一些东西来告诉代码在该行中写入下一个值。
我也试过这样的事情:
...
next_avail_row = len(list(ws.rows))
ws.append(lst)
if n+1 == max_value
wb.save(filename='path')
但在这里我也不确定如何告诉代码找到 next_avail_row = len(list(ws.rows))
写入该行后。
想法?
编辑:
目前如果我在提示符下输入例如:
1,2,3,4,5
它输出:
如果我继续输入数字,例如:
7,6,5,4,3
它输出:
等等,我期望的是:
简而言之,每次调用该函数时,它都会写入同一个文件,但在下面一行。我希望这是一个明确的解释。
您的代码有几个问题。
首先,在您的 while
循环中。每次循环时,它都会调用 wb = Worbook()
并最终调用 wb.save(filename='path')
。这每次都会创建一个新的 excel 工作表。假设在您的 wb.save()
调用中文件名每次都相同,那么每次您在新工作簿上调用保存时,它都会用相同的文件名覆盖之前创建的工作簿。
接下来,您的列表包含您输入的 weight
个值。您没有清除列表,因此每次您在循环中添加内容时,列表都会不断扩展。
此外,num = (max_value)
行实际上没有做任何事情,您还需要有某种条件才能跳出 while
循环。使用 while True
将使循环永远持续下去,除非你在某个时候打破它。
这里有一些代码可以按照您希望的方式执行此操作:
max_value = 5
line_count = 0
wb = Workbook()
ws = wb.active
white True:
lst = []
for n in range(max_value):
weight = float(input('Weight: '))
lst.append(weight)
ws.append(lst)
line_count += 1
# an example condition to break out of the loop
if line_count >= 5:
break
wb.save(filename='path')
在这里,您的 Workbook
对象仅被创建和保存一次,因此它不会每次都打开一个新对象并覆盖之前的 Workbook
。列表 lst
每次循环都会被清空,因此您的行将只与 max_value
中的值一样长。我还添加了一个打破 while True:
循环的示例方法。我设置的方式是,一旦你添加到工作簿中的行有 5 行,它就会跳出循环。你可以创建任何你想跳出循环的条件,这只是为了举例。
每次代码循环时,我都遇到了将列表值插入新行的问题。
简而言之,我每次都需要代码,它循环将 lst
中的值每次写入单独的行。
我进行了广泛的研究以试图了解其工作原理并找到了大量示例,但不幸的是,我无法使代码按照这些示例工作。
这是代码:
max_value = 5
lst = []
while True:
wb = Workbook()
ws = wb.active
num = (max_value)
for n in range(num):
weight = float(input('Weight: '))
lst.append(weight)
ws.append(lst)
if n+1 == max_value:
wb.save(filename='path')
我试过在行 ws.append(lst)
之后添加 ws.insert_rows(idx=2, amount=1)
,如下所示:
...
ws.insert_rows(idx=2, amount=1)
ws.append(lst)
if n+1 == max_value:
wb.save(filename='path')
但它什么也没做,因为我想它需要一些东西来告诉代码在该行中写入下一个值。 我也试过这样的事情:
...
next_avail_row = len(list(ws.rows))
ws.append(lst)
if n+1 == max_value
wb.save(filename='path')
但在这里我也不确定如何告诉代码找到 next_avail_row = len(list(ws.rows))
写入该行后。
想法?
编辑:
目前如果我在提示符下输入例如: 1,2,3,4,5
它输出:
如果我继续输入数字,例如: 7,6,5,4,3
它输出:
等等,我期望的是:
简而言之,每次调用该函数时,它都会写入同一个文件,但在下面一行。我希望这是一个明确的解释。
您的代码有几个问题。
首先,在您的 while
循环中。每次循环时,它都会调用 wb = Worbook()
并最终调用 wb.save(filename='path')
。这每次都会创建一个新的 excel 工作表。假设在您的 wb.save()
调用中文件名每次都相同,那么每次您在新工作簿上调用保存时,它都会用相同的文件名覆盖之前创建的工作簿。
接下来,您的列表包含您输入的 weight
个值。您没有清除列表,因此每次您在循环中添加内容时,列表都会不断扩展。
此外,num = (max_value)
行实际上没有做任何事情,您还需要有某种条件才能跳出 while
循环。使用 while True
将使循环永远持续下去,除非你在某个时候打破它。
这里有一些代码可以按照您希望的方式执行此操作:
max_value = 5
line_count = 0
wb = Workbook()
ws = wb.active
white True:
lst = []
for n in range(max_value):
weight = float(input('Weight: '))
lst.append(weight)
ws.append(lst)
line_count += 1
# an example condition to break out of the loop
if line_count >= 5:
break
wb.save(filename='path')
在这里,您的 Workbook
对象仅被创建和保存一次,因此它不会每次都打开一个新对象并覆盖之前的 Workbook
。列表 lst
每次循环都会被清空,因此您的行将只与 max_value
中的值一样长。我还添加了一个打破 while True:
循环的示例方法。我设置的方式是,一旦你添加到工作簿中的行有 5 行,它就会跳出循环。你可以创建任何你想跳出循环的条件,这只是为了举例。