我想要做的就是删除一行,如果它的值为' 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()
任何帮助都会很棒
答案 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")
注意:在此功能中,您可以发送无限个字符串单元格,所有这些行将被删除(假设它们存在于发送的单列中)。