如何删除CSV文件中值大于另一个的所有行?

时间:2015-09-08 11:26:14

标签: python csv unicode

我有一个csv文件,300行:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 2,1.60,58,56,60,60,56 3,1.90,100,98,102,98,102

我想要一个文件删除列MEAN WEIGHT>的所有行。 75并获得另一个新文件

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 3,1.90,100,98,102,98,102

5 个答案:

答案 0 :(得分:2)

如果您对非Python解决方案开放并访问bash shell或awk

$ awk -F, '$3>75' filename 

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
1,1.80,80,78,78,82,82
3,1.90,100,98,102,98,102

答案 1 :(得分:1)

使用plain python:

orig = open('original.csv', 'r')
modi = open('modified.csv', 'w')

#header
modi.write(orig.readline())

# data lines
for line in old:
    if float(line.split(',')[2]) <= 75:
        modi.write(line)

orig.close()
modi.close()

答案 2 :(得分:1)

正如@Vignesh Kalai建议的那样,使用pandas

import pandas as pd

df = pd.read_csv("yourfile.csv", sep=",")

df[ df["MEAN WEIGHT"] > 75 ].to_csv("yournewfile.csv", index=False)

已经完成了。

P.S。您要求的值低于75但是您正在显示对立面。如果是第一种情况则替换&#34; > 75&#34;通过&#34; <= 75&#34;。

答案 3 :(得分:0)

您可以使用Python csv库,如下所示:

import csv

with open('input.csv', 'r') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    # Write the header
    csv_output.writerow(next(csv_input))

    for cols in csv_input:
        if int(cols[2]) <= 75:    # Keep weights <= 75
            csv_output.writerow(cols)

因此,根据您提供的数据,您将获得以下output.csv文件:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
2,1.60,58,56,60,60,56

答案 4 :(得分:0)

打印到屏幕的Perl解决方案,类似于karakfa的Awk解决方案:

perl -F, -ane 'print if $. == 1 or $F[4] > 75' filename

@F autosplit数组从索引$F[0]开始,而awk字段以$1开头

此变体就地编辑文件:

perl -i -F, -ane 'print if $. == 1 or $F[4] > 75' filename

此变体会就地编辑文件,并进行备份filename.bak

perl -i.bak -F, -ane 'print if $. == 1 or $F[4] > 75' filename