Мой код ниже. В принципе, у меня есть файл CSV и текстовый файл "input.txt". Я пытаюсь создать приложение Python, которое будет принимать входные данные из "input.txt" и искать через CSV файл для соответствия, и если совпадение найдено, тогда он должен вернуть первый столбец CSV файла.
import csv
csv_file = csv.reader(open('some_csv_file.csv', 'r'), delimiter = ",")
header = csv_file.next()
data = list(csv_file)
input_file = open("input.txt", "r")
lines = input_file.readlines()
for row in lines:
inputs = row.strip().split(" ")
for input in inputs:
input = input.lower()
for row in data:
if any(input in terms.lower() for terms in row):
print row[0]
Скажите, что мой CSV файл выглядит так:
book title, author
The Rock, Herry Putter
Business Economics, Herry Putter
Yogurt, Daniel Putter
Short Story, Rick Pan
И скажите, что мой файл input.txt выглядит так:
Herry
Putter
Поэтому, когда я запускаю свою программу, она печатает:
The Rock
Business Economics
The Rock
Business Economics
Yogurt
Это потому, что он сначала ищет все заголовки с именем "Herry", а затем снова ищет "Putter". Поэтому, в конце концов, у меня есть дубликаты названий книг. Я пытаюсь найти способ удалить их... так что если кто-то может помочь, это будет очень полезно.
Если исходный порядок не имеет значения, сначала вставьте результаты в набор, а затем распечатайте их в конце. Но ваш пример достаточно мал, где скорость не имеет значения.
Придерживайте результаты в наборе (который похож на список, но содержит только уникальные элементы) и печатает в конце.
Что-то вроде:
if any(input in terms.lower() for terms in row):
if not row[0] in my_set:
my_set.add(row[0])
Во время поиска вы увидите список и добавьте новые результаты в список после первого поиска в списке, чтобы увидеть, есть ли результат. Затем после выполнения поиска распечатайте список.
Сначала выберите набор поисковых запросов, которые вы хотите найти в одном списке. Мы используем set(...)
здесь для устранения повторяющихся терминов поиска:
search_terms = set(open("input.txt", "r").read().lower().split())
Затем перебираем строки в таблице данных, выбирая каждый из них, соответствующий условиям поиска. Здесь я сохраняю поведение исходного кода, так как мы ищем искомый случайный случай поиска в любом столбце для каждой строки. Если вы просто хотите выполнить поиск, например. столбец автора, тогда это нужно будет изменить:
results = [row for row in data
if any(search_term in item.lower()
for item in row
for search_term in search_terms)]
Наконец, распечатайте результаты.
for row in results:
print row[0]
Если вы хотите, вы также можете перечислить авторов или любую другую информацию в таблице. Например:.
for row in results:
print '%30s (by %s)' % (row[0], row[1])