2014-01-30 3 views
1

Я пытаюсь удалить строку из файла csv, если второй столбец соответствует строке. Мой файл csv имеет следующую информацию:Удалить определенную строку в файле csv с помощью python

Name 
15 Dog 

Я хочу, чтобы строка с «именем» удалялась. Используемый мной код:

import csv 

reader = csv.reader(open("info.csv", "rb"), delimiter=',') 

f = csv.writer(open("final.csv", "wb")) 
for line in reader: 
    if "Name" not in line: 
     f.writerow(line) 
     print line 

Но строка «Имя» не удаляется. Что я делаю не так?

EDIT: Я использовал неправильный разделитель. Смена его на \ t сработала. Ниже приведен код, который работает сейчас. импорт CSV

reader = csv.reader(open("info.csv", "rb"), delimiter='\t') 

f = csv.writer(open("final.csv", "wb")) 
for line in reader: 
    if "Name" not in line: 
     f.writerow(line) 
     print line 
+0

Ваших отступов не ввинчиваются в вашем примере коды (без отступа после для цикла). Не могли бы вы это исправить? Поскольку никакие строки не отфильтровываются, вы можете предположить, что '' Name "not in line' всегда оценивает значение' True'. Возможно, вы могли бы показать нам, как выглядит файл? –

+0

Извините, что есть отступы, но он не был отформатирован правильно, когда я его сохранил. На всякий случай http://pastebin.com/9XwBkUx7 там тоже – Howli

ответ

4

Кажется, что вы указали неправильный разделитель (запятая) в csv.reader

+0

+1. Это может быть причиной проблемы, которую описывает Howlin, но мне было бы интересно увидеть больше деталей из OP, потому что прямо сейчас вы отвечаете с догадкой. –

+0

Причина, по которой я использовал запятую, заключалась в том, что я использовал код из другого вопроса на [SO] (http://stackoverflow.com/a/8566894/3204827) и предположил, что должен использовать его (я знаю плохая идея). Я изменил его с запятой на \ t, и теперь он работает. EDIT: Я добавил код, который работает для меня в первый пост. – Howli

2

Каждой строка обеспечиваемого reader является list, расколоть ваш разделитель. Что, кстати, вы указали как ,, вы уверены, что это разделитель, который вы хотите? Ваш образец делится на вкладки.

В любом случае, вы хотите проверить, есть ли 'Name' в любой элемент данной строки. Так что это будет продолжаться, независимо от того, правильный ли ваш разделитель:

for line in reader: 
    if any('Name' in x for x in line): 
     #write operation 

Обратите внимание на разницу. Эта версия проверяет наличие 'Name' в каждом элементе списка, ваш проверит ли 'Name'in список. Они семантически разные, потому что 'Name' in ['blah blah Name'] - False.

Я бы порекомендовал сначала зафиксировать ошибку разделителя. Если у вас все еще есть проблемы, используйте if any(...), так как возможно, что точный токен 'Name' нет в вашем списке, но что-то, что содержит «Имя».

Смежные вопросы