Удаление строк с помощью 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()

Любая помощь будет отличной

Ответ 1

Вы очень близки; в настоящее время вы сравниваете row[2] с целым числом 0, сравниваете со строкой "0". Когда вы читаете данные из файла, это строка, а не целое число, поэтому поэтому проверка целостности в настоящее время не выполняется:

row[2]!="0":

Кроме того, вы можете использовать ключевое слово with, чтобы сделать текущий код немного более питоническим, чтобы строки в вашем коде были уменьшены, и вы можете опустить инструкции .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

Ответ 2

У вас должен быть if row[2] != "0". В противном случае он не проверяет, равно ли строковое значение 0.