Помогите с поиском предмета в csv в python - PullRequest
0 голосов
/ 28 июня 2011

Я очень новичок в питоне. У меня есть неизменный CSV, вот пример (я только напечатал его по строке в консоли Python)

['george', 'williams', '277389', 'susan thompson', '2042228888']
['john', 'smith', '833999', 'george smith', '2041118833']
['michael', 'jackson', '281038', 'ronald jackson', '2041128493']

это названия полей

['firstname', 'lastname', 'idnumber', 'emergency contact', 'emerg contact ph']

Мне нужно иметь возможность ввести идентификационный номер, который запускает поиск через csv и выводит имя, фамилию, экстренный контакт, номер телефона человека. Какие-нибудь мысли? Мне действительно нужно знать, с чего начать, то есть я должен прочитать содержимое csv в диктовку

Ответы [ 5 ]

4 голосов
/ 28 июня 2011

Я бы лично пошел со словарем:

records = [
    ['george', 'williams', '277389', 'susan thompson', '2042228888'],
    ['john', 'smith', '833999', 'george smith', '2041118833'],
    ['michael', 'jackson', '281038', 'ronald jackson', '2041128493'],
    ]

from operator import itemgetter
recordsbyid = dict(zip(map(itemgetter(2),records),records))

, тогда вы можете сделать

>>> recordsbyid['277389']
['george', 'williams', '277389', 'susan thompson', '2042228888']

itemgetter выбирает второй элемент (id), map применяется к каждомуrecord, а zip объединяет идентификаторы с их записями в список кортежей, состоящий из (id, record).dict превращает это в словарь.

1 голос
/ 28 июня 2011

Если вам нужно отсканировать файл и найти нужную строку только один раз, вам не нужно преобразовывать все данные в словарь - просто читайте строки одну за другой, пока не найдете свою строку:

import csv

def find_row_by_id(filename, key_column, id):
    with f = open(filename, 'rb'):
        my_reader = csv.reader(f)
        for row in my_reader:
            if row[key_column] == id:
                return row
    raise Error("Could not find row")

print find_by_row('eggs.csv', 2, my_id) # my_id should by a string

Если ваш файл небольшой, и вам нужно выполнять несколько поисков только по идентификатору, преобразуйте его в словарь, как подсказывают другие ответы.

С другой стороны, если ваш файл очень (очень) большой и вам нужно быстро найти и / или много раз посмотреть, сначала прочтите ваш csv-файл в базе данных значений ключей: Надежно и эффективно база данных ключ-значение для Linux?

1 голос
/ 28 июня 2011

Я бы преобразовал этот CSV в sqlite и использовал бы запрос:

SELECT * FROM data WHERE idnumber = %s

Мне нравится работать с данными, организованными в БД, и это может принести вам больше преимуществ в будущем (более сложные запросы).

Чтобы преобразовать cvs в sqlite и проверить запросы, используйте Дополнение SQLite Manager для Firefox .

0 голосов
/ 28 июня 2011

Давайте сначала превратим каждую строку в dict, используя заголовки полей в качестве ключей и данные полей в качестве значений. Мы хотим указать, где каждая пара ключ-значение происходит из пары, которую мы собираем, «сжав» эти два списка вместе: dict(zip(field_titles, row)). Мы можем использовать понимание списка, чтобы составить список этих диктовок из списка входных строк: [dict(zip(field_titles, row)) for row in data].

Мы хотим иметь возможность искать их по id_number, поэтому мы сделаем содержащий dict, где ключ - это idnumber, а значение - это строка dict. Мы можем получить идентификационный номер, посмотрев его в row_dict: dict((row_dict['id_number'], row_dict) for row_dict in data).

0 голосов
/ 28 июня 2011

Используйте raw_input, чтобы получить требуемый id.

. Если у вас есть, используйте оператор if, чтобы увидеть, совпадает ли идентификатор:

Где строка ['george', 'williams', '277389', 'susan thompson', '2042228888']

if line[2] == id:
    for x in line:
        if not x == line[2]:
            print x

Надеюсь, это поможет!

...