2016-05-10 3 views
1

Я хотел бы найти подстроку в строках csv-файла. Вот что у меня есть. Я знаю, что он не выполняет поиск, и я не пишу вывод правильно.Python: простой фильтр подстроки csv

import csv 

def filterCSVfile (path): 
    filterSubstrings = ['signal1', 'signal2'] 
    csvData = open (path) 
    filereader = csv.reader(csvData, delimiter=',') 

    rows = [row for row in filereader if row in filterSubstrings] 

    outFileHandle = open("output.csv", "w") 
    outFileHandle.write(rows) 
    outFileHandle.close() 

filterCSVfile('history.csv') 

EDIT

Файл CSV содержит два столбца, один является читаемым человеком даты и время, а другой является URL, например:

2016-02-12 15:37:15,http://www.youtube.com/watch?v=wt60lVB8sHo 
2016-02-12 15:37:15,https://www.youtube.com/watch?v=wt60lVB8sHo 
2016-02-12 15:54:33,http://kizi.com/games/paintworld-2-monsters 
2016-02-12 16:12:56,http://kizi.com/games/u/icycle 
2016-02-12 16:13:03,http://kizi.com/games/u/iron-turtle 
2016-02-12 16:13:46,http://www.armorgames.com/ 
2016-02-12 16:13:46,http://armorgames.com/ 

Я хотел бы для извлечения строк, которые содержат либо «сигнал1», либо «сигнал2» в URL-адресе, например, http://signal1.com.

+0

Я думаю, что вы ищете, что весь CSV строка содержится в фильтрах ... Если вероятно проверить пересечение? – karina

+0

Строки должны содержать как «сигнал1», так и «сигнал2» или один из них? – SparkAndShine

+0

Я фильтрую, чтобы держать строки, содержащие либо «сигнал1», либо «сигнал2» и отбрасывать все остальные строки. Я попробовал ваш код ниже, и он возвращает пустой файл. – interwebjill

ответ

0

Заменить строку,

rows = [row for row in filereader if row in filterSubstrings] 

с,

rows = [row for row in filereader if any([word in row[1] for word in filterSubstrings])] 

Исходный код

import csv 

def filterCSVfile(path): 
    filterSubstrings = set(['signal1', 'signal2']) # for efficency reason 

    with open(path, 'r') as csvData: 
     filereader = csv.reader(csvData, delimiter=',') 
     rows = [row for row in filereader if any([word in row[1] for word in filterSubstrings])] # change this row 

    with open('output.csv', 'w') as outFileHandle 
     writer = csv.writer(outFileHandle) # get a write object 
     writer.writerows(rows) 

filterCSVfile('history.csv') 

Test

Содержание history.csv,

date1,http://signal1.com 
2016-02-12 15:37:15,http://www.youtube.com/watch?v=wt60lVB8sHo 
2016-02-12 15:37:15,https://www.youtube.com/watch?v=wt60lVB8sHo 
date2,http://signal2.com 

Выход rows,

[['date1', 'http://signal1.com'], ['date2', 'http://signal2.com']] 
+0

@interwebjill, вам нужно получить объект записи перед записью в файлы с помощью 'csv.writer'. Проверьте обновленный ответ. – SparkAndShine

+0

Файл создан! Но пусто. Я не ищу пересечения, но одну подстроку ИЛИ другую. – interwebjill

+0

@interwebjill, вы можете добавить часть своего файла csv на свой вопрос. – SparkAndShine