Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenPyXL-如何根据某些条件从Excel文件中删除行?_Python_Python 3.x_Openpyxl - Fatal编程技术网

Python OpenPyXL-如何根据某些条件从Excel文件中删除行?

Python OpenPyXL-如何根据某些条件从Excel文件中删除行?,python,python-3.x,openpyxl,Python,Python 3.x,Openpyxl,我想删除excel文件中的行,知道这些值。我使用openpyxl: key\u values\u list是带有数字的列表(所有数字都显示在excel文件的列中) 上面的代码并没有删除所有对应的行在for循环中删除直接元素时总会遇到问题。考虑一个具有12行的行及其相应行值的代码: for i in range(1, sh.max_row + 1): print(sh.cell(row=i, column=1).value) # 1 .. 12 现在看看当您开始删除内容时会发生什么:

我想删除excel文件中的行,知道这些值。我使用openpyxl:

key\u values\u list
是带有数字的列表(所有数字都显示在excel文件的列中)


上面的代码并没有删除所有对应的行

在for循环中删除直接元素时总会遇到问题。考虑一个具有12行的行及其相应行值的代码:

for i in range(1, sh.max_row + 1):
    print(sh.cell(row=i, column=1).value)

# 1 .. 12
现在看看当您开始删除内容时会发生什么:

for i in range(1, sh.max_row + 1):
    if sh.cell(row=i, column=1).value in [5,6,7]:
        sh.delete_rows(i, 1)
    print(f'i = {i}\tcell value (i, 1) is {sh.cell(row=i, column=1).value}')

# i = 1     cell value (i, 1) is 1
# i = 2     cell value (i, 1) is 2
# i = 3     cell value (i, 1) is 3
# i = 4     cell value (i, 1) is 4
# i = 5     cell value (i, 1) is 5
# i = 6     cell value (i, 1) is 7
# i = 7     cell value (i, 1) is 9
# i = 8     cell value (i, 1) is 10
# i = 9     cell value (i, 1) is 11
# i = 10    cell value (i, 1) is 12
# i = 11    cell value (i, 1) is None
# i = 12    cell value (i, 1) is None
您可以看到,在[5,6,7]中的
i期间,行的移动从第6行开始,因为第5行已被删除,使原始第6行成为新的第5行,原始第7行成为新的第6行。。。因此,在下一次迭代的
i=6
中,单元格实际上引用了原始数据中第7行的值。您实际上跳过了对第6行的迭代

最简单的答案是使用
while
循环,而不是
for

i = 1
while i <= sh.max_row:
    print(f'i = {i}\tcell value (i, 1) is {sh.cell(row=i, column=1).value}')
    if sh.cell(row=i, column=1).value in [5,6,7]:
        sh.delete_rows(i, 1)
        # Note the absence of incremental.  Because we deleted a row, we want to stay on the same row because new data will show in the next iteration.
    else:
        i += 1
        # Because the check failed, we can safely increment to the next row.

# i = 1 cell value (i, 1) is 1
# i = 2 cell value (i, 1) is 2
# i = 3 cell value (i, 1) is 3
# i = 4 cell value (i, 1) is 4
# i = 5 cell value (i, 1) is 5 # deleted
# i = 5 cell value (i, 1) is 6 # deleted
# i = 5 cell value (i, 1) is 7 # deleted
# i = 5 cell value (i, 1) is 8
# i = 6 cell value (i, 1) is 9
# i = 7 cell value (i, 1) is 10
# i = 8 cell value (i, 1) is 11
# i = 9 cell value (i, 1) is 12

# verify the data has been deleted
for i in range(1, sh.max_row +1):
    print(sh.cell(row=i, column=1).value)

# 1
# 2
# 3
# 4
# 8
# 9
# 10
# 11
# 12
i=1

当我时,您总会发现在for循环中删除直接元素有问题。考虑一个具有12行的行及其相应行值的代码:

for i in range(1, sh.max_row + 1):
    print(sh.cell(row=i, column=1).value)

# 1 .. 12
现在看看当您开始删除内容时会发生什么:

for i in range(1, sh.max_row + 1):
    if sh.cell(row=i, column=1).value in [5,6,7]:
        sh.delete_rows(i, 1)
    print(f'i = {i}\tcell value (i, 1) is {sh.cell(row=i, column=1).value}')

# i = 1     cell value (i, 1) is 1
# i = 2     cell value (i, 1) is 2
# i = 3     cell value (i, 1) is 3
# i = 4     cell value (i, 1) is 4
# i = 5     cell value (i, 1) is 5
# i = 6     cell value (i, 1) is 7
# i = 7     cell value (i, 1) is 9
# i = 8     cell value (i, 1) is 10
# i = 9     cell value (i, 1) is 11
# i = 10    cell value (i, 1) is 12
# i = 11    cell value (i, 1) is None
# i = 12    cell value (i, 1) is None
您可以看到,在[5,6,7]
中的
i期间,行的移动从第6行开始,因为第5行已被删除,使原始第6行成为新的第5行,原始第7行成为新的第6行。。。因此,在下一次迭代的
i=6
中,单元格实际上引用了原始数据中第7行的值。您实际上跳过了对第6行的迭代

最简单的答案是使用
while
循环,而不是
for

i = 1
while i <= sh.max_row:
    print(f'i = {i}\tcell value (i, 1) is {sh.cell(row=i, column=1).value}')
    if sh.cell(row=i, column=1).value in [5,6,7]:
        sh.delete_rows(i, 1)
        # Note the absence of incremental.  Because we deleted a row, we want to stay on the same row because new data will show in the next iteration.
    else:
        i += 1
        # Because the check failed, we can safely increment to the next row.

# i = 1 cell value (i, 1) is 1
# i = 2 cell value (i, 1) is 2
# i = 3 cell value (i, 1) is 3
# i = 4 cell value (i, 1) is 4
# i = 5 cell value (i, 1) is 5 # deleted
# i = 5 cell value (i, 1) is 6 # deleted
# i = 5 cell value (i, 1) is 7 # deleted
# i = 5 cell value (i, 1) is 8
# i = 6 cell value (i, 1) is 9
# i = 7 cell value (i, 1) is 10
# i = 8 cell value (i, 1) is 11
# i = 9 cell value (i, 1) is 12

# verify the data has been deleted
for i in range(1, sh.max_row +1):
    print(sh.cell(row=i, column=1).value)

# 1
# 2
# 3
# 4
# 8
# 9
# 10
# 11
# 12
i=1

而我请在
for
定义之后添加
打印(sheet.cell(row=i,column=1).value在key\u values\u列表中)
,以查看它是否真的是
True
。如果要删除的两行相邻,则向前迭代将丢失行。删除第N行时,第N+1行将成为新行N,但接下来将检查第N+1行,该行在删除前为N+2。简单的解决方法:从下到上迭代(
范围(sheet.max\u row,1,-1)
)。请在
定义之后添加
打印(sheet.cell(row=i,column=1)。key\u values\u list中的值)
,以查看它是否真的
真的
如果要删除的两行相邻,则向前迭代将丢失行。删除第N行时,第N+1行将成为新行N,但接下来将检查第N+1行,该行在删除前为N+2。简单修复:从下到上迭代(
范围(sheet.max_row,1,-1)
)。您好,您知道如何在计算后检查单元格值是否为NA,然后删除/隐藏该行吗?我不希望NA值显示在图表中。Thankshi,您知道如何在计算后检查单元格值是否有NA,然后删除/隐藏该行吗?我不希望NA值显示在图表中。谢谢