2

我正在尝试使用 python 删除 file1.csv 中包含 file2.csv 中的字符串的所有行。我希望它搜索 file1.csv 的 column1 中的所有值,并删除 column1 在其值中包含与 file2.csv 中相同的字符串的整行。

我知道 bash 中的 grep -v 只需一个命令即可完成相同的操作。但是,我需要针对 file2.csv 中超过 40,000 个可能的字符串抑制file1.csv。执行此命令时,Bash 需要很长时间,甚至崩溃。

有谁知道一个可靠的脚本,它可以做 grep -v 在 python 中所做的事情,但是在抑制包含数千个字符串的文件时?

只是为了确保清楚:

文件 1.csv:

column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14

文件 2.csv:

column1
i4x

文件 3.csv:

column1,column2,column3
www.vfekjfwo11k.com,772,100
www.tum33kkwfl.com,1100,2

但是,再次,我在 python 中需要它,因为 file2.csv 中的字符串数超过 40,000。

4

1 回答 1

2

一种可能适用于您的用例的解决方案是 3rd 方库 Pandas + regex。

但是,我强烈建议您使用更有效的算法,例如实现基于 trie 的Aho-Corasick的算法,例如this solution

import pandas as pd
from io import StringIO

mystr1 = StringIO("""column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14""")

mystr2 = StringIO("""column1
i4x""")

# read files, replace mystr1 / mystr2 with 'File1.csv' / 'File2.csv'
df = pd.read_csv(mystr1)
df_filter = pd.read_csv(mystr2)

# create regex string from filter values
str_filter = '|'.join(df_filter['column1'])

# apply filtering
df = df[~df['column1'].str.contains(str_filter)]

# export back to csv
df.to_csv('file_out.csv', index=False)

print(df)

               column1  column2  column3
1  www.vfekjfwo11k.com      772      100
3   www.tum33kkwfl.com     1100        2
于 2018-06-09T22:36:52.943 回答