在CSV文件中使用Python删除行

时间:2015-04-19 04:51:16

标签: python csv

我想要做的就是删除一行,如果它的值为' 0'在第三栏。数据的一个例子是:

6.5, 5.4, 0, 320
6.5, 5.4, 1, 320

因此需要删除第一行,而第二行则需要删除。

到目前为止我所拥有的内容如下:

import csv
input = open('first.csv', 'rb')
output = open('first_edit.csv', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
    if row[2]!=0:
        writer.writerow(row)
input.close()
output.close()

任何帮助都会很棒

3 个答案:

答案 0 :(得分:17)

你很亲密;目前您将row[2]与整数0进行比较,与字符串"0"进行比较。当您从文件中读取数据时,它是一个字符串而不是整数,因此这就是您的整数检查当前失败的原因:

row[2]!="0":

此外,您可以使用with关键字使当前代码稍微更加pythonic,以便减少代码中的行,并且可以省略.close语句:

import csv
with open('first.csv', 'rb') as inp, open('first_edit.csv', 'wb') as out:
    writer = csv.writer(out)
    for row in csv.reader(inp):
        if row[2] != "0":
            writer.writerow(row)

请注意,input是内置的Python,因此我使用了另一个变量名称。


编辑 :csv文件行中的值以逗号分隔;在正常的csv中,它们只是以逗号分隔,并且对"0"的检查可行,因此您可以使用strip(row[2]) != 0,也可以查看" 0"

更好的解决方案是更正csv格式,但是如果您想要保留当前格式,以下内容将适用于您给定的csv文件格式:

$ cat test.py 
import csv
with open('first.csv', 'rb') as inp, open('first_edit.csv', 'wb') as out:
    writer = csv.writer(out)
    for row in csv.reader(inp):
        if row[2] != " 0":
            writer.writerow(row)
$ cat first.csv 
6.5, 5.4, 0, 320
6.5, 5.4, 1, 320
$ python test.py 
$ cat first_edit.csv 
6.5, 5.4, 1, 320

答案 1 :(得分:1)

你应该有if row[2] != "0"。否则,它不会检查字符串值是否等于0.

答案 2 :(得分:0)

使用 pandas 惊人的库:

问题的解决方案:

import pandas as pd


df = pd.read_csv(file)
df =  df[df.name != "dog"] 

# df.column_name != whole string from the cell
# now, all the rows with the column: Name and Value: "dog" will be deleted

df.to_csv(file, index=False)

通用通用解决方案:

使用这个功能:

def remove_specific_row_from_csv(file, column_name, *args):
    '''
    :param file: file to remove the rows from
    :param column_name: The column that determines which row will be 
           deleted (e.g. if Column == Name and row-*args
           contains "Gavri", All rows that contain this word will be deleted)
    :param args: Strings from the rows according to the conditions with 
                 the column
    '''
    row_to_remove = []
    for row_name in args:
        row_to_remove.append(row_name)
    try:
        df = pd.read_csv(file)
        for row in row_to_remove:
            df = df[eval("df.{}".format(column_name)) != row]
        df.to_csv(file, index=False)
    except Exception  as e:
        raise Exception("Error message....")

函数实现:

remove_specific_row_from_csv(file_name, "column_name", "dog_for_example", "cat_for_example")

注意:在此功能中,您可以发送无限个字符串单元格,所有这些行将被删除(假设它们存在于发送的单列中)。