5

我有一个非常大的 excel 文件,我需要删除大约 20,000 行,这取决于满足一个简单的条件,并且在使用过滤器时,excel 不会让我删除如此复杂的范围。条件是:

如果第一列包含值 X,那么我需要能够删除整行。

我正在尝试使用 python 和 xlwt 自动执行此操作,但不太确定从哪里开始。寻求一些代码片段让我开始......感谢那里的任何帮助!

4

6 回答 6

12

不要删除。只需复制您需要的内容。

  1. 读取原始文件
  2. 打开一个新文件
  3. 迭代原始文件的行(如果该行的第一列不包含值 X,则将此行添加到新文件中)
  4. 关闭两个文件
  5. 将新文件重命名为原始文件
于 2011-04-12T12:31:39.863 回答
4

我喜欢使用 COM 对象来获得这种乐趣:

import win32com.client
from win32com.client import constants

f = r"h:\Python\Examples\test.xls"
DELETE_THIS = "X"

exc = win32com.client.gencache.EnsureDispatch("Excel.Application")
exc.Visible = 1
exc.Workbooks.Open(Filename=f)

row = 1
while True:
    exc.Range("B%d" % row).Select()
    data = exc.ActiveCell.FormulaR1C1
    exc.Range("A%d" % row).Select()
    condition = exc.ActiveCell.FormulaR1C1

    if data == '':
        break
    elif condition == DELETE_THIS:
        exc.Rows("%d:%d" % (row, row)).Select()
        exc.Selection.Delete(Shift=constants.xlUp)
    else:
        row += 1

# Before
# 
#      a
#      b
# X    c
#      d
#      e
# X    d
#      g
#        

# After
#
#      a
#      b
#      d
#      e
#      g

我通常记录 Excel 宏的片段并将它们与 Python 粘合在一起,因为我不喜欢 Visual Basic :-D。

于 2011-04-12T13:40:19.450 回答
2

您可以尝试使用 csv 阅读器:

http://docs.python.org/library/csv.html

于 2011-04-12T12:32:51.223 回答
1

您可以使用,

sh.Range(sh.Cells(1,1),sh.Cells(20000,1)).EntireRow.Delete()

将删除打开的 Excel 电子表格中的第 1 到 20,000 行,因此,

if sh.Cells(1,1).Value == 'X':

   sh.Cells(1,1).EntireRow.Delete()
于 2017-01-25T21:27:32.240 回答
0

如果您只需要删除数据(而不是“删除”行,即移动行),您可以尝试使用我的模块 PyWorkbooks。您可以在此处获取最新版本:

https://sourceforge.net/projects/pyworkbooks/

有一个 pdf 教程来指导您如何使用它。快乐编码!

于 2011-04-12T16:38:39.923 回答
-1

我已经使用 Pandas 包实现了这一点....

import pandas as pd

#Read from Excel
xl= pd.ExcelFile("test.xls")

#Parsing Excel Sheet to DataFrame
dfs = xl.parse(xl.sheet_names[0])

#Update DataFrame as per requirement
#(Here Removing the row from DataFrame having blank value in "Name" column)

dfs = dfs[dfs['Name'] != '']

#Updating the excel sheet with the updated DataFrame

dfs.to_excel("test.xls",sheet_name='Sheet1',index=False)
于 2016-01-06T06:00:48.153 回答