2011-04-12 269 views
2

我有一个非常大的ex​​cel文件,我需要删除大约20,000行,只要满足一个简单条件,excel就不会让我在使用过滤器时删除这么复杂的范围。条件是:Python在excel电子表格中删除一行

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

我想使用python和xlwt自动化,但我不太确定从哪里开始。寻求一些代码snippits让我开始... 感谢您的任何帮助!

回答

9

请勿删除。只需复制你需要的东西。

  1. 读取原始文件
  2. 打开一个新文件
  3. 遍历原始文件的行(如果该行的第一列不包含值X,该行添加到新的文件)
  4. 接近这两个文件
  5. 新的文件重命名成原始文件
+0

举个例子 – 2017-03-10 13:40:55

1

我喜欢使用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。

+0

非常感谢!这真的很有帮助..但是我不能让代码运行。我正在使用一个mac - 有没有办法在OSX上使用COM对象? – Jane 2011-04-12 14:32:28

+0

它使用win32 api,它不能在Mac上运行。对不起,我不是OSX的人。但是,你能否将数据转化为csv,删除数据,隐藏回来?这将是最简单的方法。 – Fenikso 2011-04-12 15:42:07

+0

我不确定Excel如何在Mac上运行,但在Windows上,您可以再做一件事。 1)在第一列(Data/Filter/Autofilter)上创建自动过滤器,2)仅显示具有“X”的行,4)选择所有可见的行,3)删除这些行,4)取消隐藏。无需精心编程。 – Fenikso 2011-04-12 15:45:34

0

如果你只需要删除数据(而不是'摆脱'行,即它移动行),你可以尝试使用我的模块,PyWorkbooks。你可以在这里获取最新版本:

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

有一个PDF教程,指导您如何使用它。快乐的编码!

-1

我实现用熊猫包.... 进口大熊猫作为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) 
+0

在多个问题中剪切和粘贴相同的答案通常并不能很好地结束。为每个问题定制答案,或者回答一个问题,并标记重复问题结束。删除六个答案并不罕见。只是一个fyi – Drew 2016-01-06 06:03:30

0

可以使用,

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

将删除行1至20,000在一个开放的Excel电子表格等等,

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

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