Python:如果没有来自单独的文本模式列表的匹配,则从csv写入行

时间:2018-02-11 19:07:58

标签: python pandas csv

我是初学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>

2 个答案:

答案 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个。