我是初学python用户。
如何通过比较单独的文本模式列表并排除具有匹配模式的行来将行写入csv文件?
这是一个具体的例子:
listfile: spam, eggs, bacon,
csvfile:
col 1 col 2 col 3
row 1 zzz not eggs zzz
2 xxx bacon qqq
3 eee not bacon ttt
4 ttt eggs hhh
5 ggg not spam ppp
6 yyy eggs www
我需要编写的csv文件应该只有行1,3和5,因为col 2值与这些行的列表中的任何值都不匹配。
假设下面的filedata,我该如何写这个?
mycsv = csv.reader(open('spameggsbacon.csv'))
listfile = listfile.txt
for row in mycsv:
text = row[1]
writecsvfile = open('write.csv', 'a')
编辑:根据Md Johirul Islam的回答,我试过:
import csv
import pandas as pd
data = pd.read_csv('spameggsbacon.csv')
listfiledata = 'listfile.txt'
with open(listfiledata) as f:
listfiledata = f.readlines()
listfiledata = [x.strip() for x in listfiledata]
data = data[~data['col2'].isin(listfiledata)]
data.to_csv('spameggsbacon.csv', sep=',')
print(listfiledata)
print(data.head)
代码运行,但不会删除具有匹配值的行。看来原因与这条线的编写方式有关:
data = data[~data['col2'].isin(listfiledata)]
编辑2:不确定是否重要,但我修改了原始示例,以澄清col2中的值可能会重复,例如,“鸡蛋”#39;出现在第4行和第6行
编辑3:
如果您运行
,就会看到以下内容 print(listfiledata)
print(data.head)
输出是:
['spam,eggs,bacon']
<bound method NDFrame.head of col1 col2 col3
0 zzz not eggs zzz
1 zzz bacon zzz
2 zzz not bacon zzz
3 zzz eggs zzz
4 zzz not spam zzz
5 zzz eggs zzz>
答案 0 :(得分:0)
尝试使用pandas库。例如,让我们考虑您的初始csv文件名为spameggsbacon.csv
,其数据为
col 1 col 2 col 3
row 1 zzz not eggs zzz
2 xxx bacon qqq
3 eee not bacon ttt
4 ttt eggs hhh
5 ggg not spam ppp
6 yyy spam www
您将此数据视为DataFrame
import pandas as pd
data = pd.read_csv('spameggsbacon.csv')
然后,您可以对此DataFrame
listfiledata = ['spam', 'eggs', 'bacon']
data = data[~data['col 2'].isin(listfiledata)]
ow过滤的DataFrame
将不包含listfiledata
中包含任何条目的行。
现在,您可以使用以下代码和过滤后的数据重写csv文件。
data.to_csv('spameggsbacon.csv', sep=',')
您也可以写入新文件。只需更改文件名即可。
答案 1 :(得分:0)
以下是有效的答案:
import csv
import pandas as pd
import os
df1 = pd.read_csv('spameggsbacon.csv') # file with multiple columns
df2 = pd.read_csv('listfile.csv') # file with one column
mask = df1.iloc[:,1].isin(df2.iloc[:,0])
df1[~mask].to_csv('spameggsbacon2.csv', index=False)
print(df1[~mask])
这适用于所示的示例,但它不起作用(re:带有一列的文件)和更大的列表,例如40个值而不是3个。