在 Python 中删除某些行而不逐行迭代整个文件

Remove certain rows without iterating the whole file line by line in Python

我有如下数据集:

Category,Date,Id,Amount
Risk A,11/12/2020,1,-10
Risk A,11/13/2020,2,10
Risk A,11/14/2020,3,22
Risk A,11/15/2020,4,32
Total Risk A : 4  ----- needs to be removed
Risk C,11/9/2020,5,43
Risk C,11/10/2020,6,22
Risk C,11/11/2020,7,11
Risk C,11/12/2020,8,-50
Total Risk C : 4   ----- needs to be removed
Risk D,11/12/2020,9,3
Risk D,11/13/2020,10,1
Risk D,11/14/2020,11,3
Risk D,11/15/2020,12,4
Risk D,11/9/2020,13,55
Risk D,11/10/2020,14,32
Total Risk C : 6      ----- needs to be removed

在数据行之间,有一些特定的总计(汇总)行,我需要将其从文件中删除。 寻找一种更好的方法来删除这些行,而不是在 python.As 中逐行迭代文件我有几千行并且需要时间来删除一些摘要行。 请建议?

您可以使用Regex来执行字符串替换:

import re
t = """Category,Date,Id,Amount
Risk A,11/12/2020,1,-10
Risk A,11/13/2020,2,10
Risk A,11/14/2020,3,22
Risk A,11/15/2020,4,32
Total Risk A : 4  ----- needs to be removed
Risk C,11/9/2020,5,43
Risk C,11/10/2020,6,22
Risk C,11/11/2020,7,11
Risk C,11/12/2020,8,-50
Total Risk C : 4   ----- needs to be removed
Risk D,11/12/2020,9,3
Risk D,11/13/2020,10,1
Risk D,11/14/2020,11,3
Risk D,11/15/2020,12,4
Risk D,11/9/2020,13,55
Risk D,11/10/2020,14,32
Total Risk C : 6      ----- needs to be removed"""

print(re.sub(r'\nTotal.*','', t))

re.sub 将找到文件中与模式匹配的所有部分(r'\nTotal.*':换行符后跟单词 "Total",然后是任何字符,直到行尾), 并将它们替换为 ''.

如果不单独查看每一行,就不可能知道要删除哪些行,因为如果不与每一行进行交互,就无法分辨哪些行是摘要,哪些行不是。 (可以实施一些小的优化,比如如果两个不能连续发生,则跳过摘要行后的下一行,但这些的影响充其量是最小的)。一种可能更有效的加速程序的方法是,不是逐行检查文件,而是将整个程序读入内存,将其编辑为字符串或列表,然后将其全部写入一个新的一次归档。这会比听起来你正在做的更快,因为输入输出操作比那些只对内存中的变量起作用的操作花费的时间要长得多。