Словарь CSV в Python со всеми именами столбцов? - PullRequest
4 голосов
/ 17 апреля 2011

Я все еще довольно новичок в использовании python для программирования с нуля, так что в качестве упражнения я решил взять файл, который обрабатываю с помощью SQL, и попытаться дублировать функциональность с помощью Python.Кажется, я хочу взять мой (сжатый, zip) CSV-файл и создать его из Dict (или, может быть, из-за dict?).Когда я использую читатель dict, я получаю 1-ю строку в качестве ключа, а не каждый столбец в качестве своего собственного ключа?Например,

import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file    = zipfile.ZipFile(sys.argv[0])
items_file  = zip_file.open('AllListing1RES.txt', 'rU')

for row in csv.DictReader(items_file,dialect='excel'):
    pass

Выход:

>>> for key in row:
        print 'key=%s, value=%s' % (key, row[key])

key=MLS_ACCT    PARCEL_ID   AREA    COUNTY  STREET_NUM  STREET_NAME CITY        ZIP STATUS  PROP_TYPE   LIST_PRICE  LIST_DATE   DOM DATE_MODIFIED   BATHS_HALF  BATHS_FULL  BEDROOMS    ACREAGE YEAR_BUILT  YEAR_BUILT_DESC OWNER_NAME  SOLD_DATE   WITHDRAWN_DATE  STATUS_DATE SUBDIVISION PENDING_DATE    SOLD_PRICE,  
value=492859    28-15-3-009-001.0000    200 JEFF    3828    ORLEANS RD  MOUNTAIN BROOK  35243   A   SFR 324900  3/3/2011    2   3/4/2011 12:04:11 AM    0   2   3   0   1968    EXIST   SPARKS          3/3/2011 11:54:56 PM    KNOLLWOOD

Итак, я ищу столбец для MLS_ACCT и отдельный для PARCEL_ID и т. Д., Чтобы я мог что-то сделатьнапример, средние цены по всем элементам, которые содержат KNOLLWOOD в поле SUBDIVISION С дополнительным подразделом по диапазону дат, дате продажи и т. д.

Я хорошо знаю, как это сделать с SQL, но, как я уже сказал, яя пытаюсь получить некоторые навыки Python здесь.Я читаю последние несколько дней, но мне еще не удалось найти каких-либо очень простых иллюстраций по этому виду использования.Указатели на упомянутые документы будут оценены.Я понимаю, что мог бы использовать резидентную память SQL-lite, но опять-таки мое желание - изучить подход Python. Я читал кое-что о Numpy и Scipy и загрузил sage, но все еще не могу найти некоторые полезные иллюстрации, так как эти инструменты, кажется, сосредоточены намассивы только с числами в качестве элементов, и у меня есть много совпадений строк, которые мне нужно сделать, а также вычисления и сравнения диапазонов дат.

В конце концов мне нужно будет заменить значения в таблице (так как у меня есть грязные данные), я делаю это сейчас, имея «таблицу перевода», которая содержит все грязные варианты и предоставляет «чистый» ответ для окончательногоиспользовать.

Ответы [ 3 ]

6 голосов
/ 17 апреля 2011

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

Если это правильно, укажите разделитель табуляции в конструкторе DictReader.

for row in csv.DictReader(items_file, dialect='excel', delimiter='\t'):
    for key in row:
        print 'key=%s, value=%s' % (key, row[key])

Источник: http://docs.python.org/library/csv.html

1 голос
/ 17 апреля 2011

Запись операции на чистом Python, безусловно, возможна, но тогда вам придется выбирать свои алгоритмы.Вывод строки, который вы разместили выше, выглядит так, будто синтаксический анализ произошел неправильно;на самом деле, это вообще не CSV, это TSV?Попробуйте передать delimiter='\t' или dialect=csv.excel_tab в DictReader.

Как только чтение выполнено правильно, DictReader должен работать для получения строк в виде словарей, типичной структуры, ориентированной на строки.Как ни странно, обычно это не эффективный способ обработки запросов, подобных вашему;наличие только списков столбцов значительно облегчает поискОриентация строк означает, что вам нужно переделать некоторую поисковую работу для каждого ряда.Такие вещи, как сопоставление дат, требуют данных, которые, безусловно, отсутствуют в CSV, например, как даты представлены и какие столбцы являются датами.

Пример получения структуры данных, ориентированной на столбцы (однако с загрузкой всего файла):

import csv
allrows=list(csv.reader(open('test.csv')))
# Extract the first row as keys for a columns dictionary
columns=dict([(x[0],x[1:]) for x in zip(*allrows)])

Промежуточные этапы перехода к списку и сохранения в переменной не являютсянеобходимо.Ключ использует zip (или его двоюродный брат itertools.izip) для транспонирования таблицы.

Затем извлекает столбец two из всех строк с определенным критерием в столбце one:

matchingrows=[rownum for (rownum,value) in enumerate(columns['one']) if value>2]
print map(columns['two'].__getitem__, matchingrows)

Когда вы знаете тип столбца, может иметь смысл проанализировать его, используя соответствующие функции, такие как datetime.datetime.strptime .

0 голосов
/ 17 апреля 2011

На первый взгляд кажется, что ваш ввод может быть не CSV, но вместо этого может быть разделен табуляцией. Посмотрите документы на python.org , вы можете создать диалект и использовать его для изменения разделителя.

import csv
csv.register_dialect('exceltab', delimiter='\t')
for row in csv.DictReader(items_file,dialect='exceltab'):
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...