Вывести CHANGING OrderedDict в CSV

Я залил этот пост, но ответов нет похоже, работает для моих нужд. Однако я новичок в Python, так что это тоже может быть проблемой.

Вот несколько строк из output.csv:
Адрес сторон дела
25 THOMAS ST., PORTAGE, IN
CHESTNUT ST. 67, MILLBROOK, NJ
1 EMPIRE DR ., ОСТИН, Техас, 11225
111 ВАШИНГТОН-АВ. # 404, VALPARAISO, AK
89 E. JERICHO TPKE., Scarssdale, AZ

ОРИГИНАЛЬНЫЙ ПОЧТОВЫЙ ИНДЕКС

import usaddress
import csv

with open('output.csv') as csvfile:
reader = csv.DictReader(csvfile)
    for row in reader:
        addr=row['Case Parties Address']
        data = usaddress.tag(addr)
        print(data)

(OrderedDict([('AddressNumber', u'4167'), ('StreetNamePreType', u'Highway'), ('StreetName', u'319'), ('StreetNamePostDirectional', u'E'), ('PlaceName', u'Conway'), ('StateName', u'SC'), ('ZipCode', u'29526-5446')]), 'Street Address'

Как и в предыдущем посте, мне нужно вывести проанализированные данные в csv. Насколько я могу судить, мне нужно сделать следующие шаги:

  1. Предоставьте заголовки в виде списка для справки. (Они перечислены здесь в разделе «Подробности».)
  2. Используя Usaadress.tag (), проанализируйте source_csv как «данные», НО сохраните их соответствующие «ключи».
  3. Сопоставьте ключ: data с header_reference
  4. Экспорт в output_csv с одной строкой заголовка.

Я использую модуль Python, usaaddress, для синтаксического анализа большого CSV (200 КБ +). Модуль выводит проанализированные данные с помощью OrderedDict. Вышеупомянутый пост работает только в том случае, если все поля сопоставляются с одними и теми же заголовками для всех записей. Однако одним из МНОГИХ преимуществ usaddress является то, что он анализирует данные, даже если нет полей для анализа. Так, например, «123 Fake St, Maine, PA» идеально соответствует заголовкам адреса, города и штата. Но «123 Jumping Block, Suite 600, Maine, PA» поместит «Suite 600» в столбец «город», так как он соответствует статически в зависимости от позиции. Если я анализирую последнее, usaddress предоставляет адрес, идентификатор занятости (например, "номер набора"), город, заголовки штата.

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

Похоже, что мой код не будет знать, что представляет собой каждая точка данных, пока не будет маршрутизирован через модуль; ситуация с курицей или яйцом. Как мне записать строки в файл CSV, если каждая строка может иметь разные подмножества столбцов?

Для справки, ошибка, которую я получаю при попытке ближайшего решения (предоставляемого isosceleswheel), - это valueerror: I / O (...), и они ссылаются на строки 107 и 90 библиотеки csv.py, обе из которых относятся к именам полей. .

with open('output.csv') as csvfile:
reader = csv.DictReader(csvfile)

with open('myoutputfile', 'w') as o:  # this will be the new file you write to
    for row in reader:
        addr=row['Case Parties Address']
        data = usaddress.tag(addr)
        header = ','.join(data.keys()) + '\n'  # this will make a string of the header separated by comma with a newline at the end
        data_string = ','.join(data.values()) + '\n' # this will make a string of the values separated by comma with a newline at the end
        o.write(header + data_string)  # this will write the header and then the data on a new line with each field separated by commas

person JoeB    schedule 03.08.2015    source источник


Ответы (2)


см. эту проблему с github для решения

поскольку мы знаем все возможные метки в usaddress, мы можем использовать их для определения полей в выводе.

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

person Cathy D.    schedule 06.08.2015

Вы хотите проанализировать каждый адрес отдельно и сохранить в списке. Затем вы можете использовать Pandas DataFrame для выравнивания выходных данных. Что-то вроде этого:

import pandas as pd

data = ['Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637',
        'State & Lake, Chicago']

tagged_addresses = [usaddress.parse(line) for line in data]

address_df = pd.DataFrame(tagged_addresses)

print(address_df)

  AddressNumber BuildingName IntersectionSeparator PlaceName SecondStreetName StateName StreetName StreetNamePostType StreetNamePreDirectional ZipCode
0          5757  Robie House                   NaN   Chicago              NaN        IL   Woodlawn             Avenue                    South   60637
1           NaN          NaN                     &   Chicago             Lake       NaN      State                NaN                      NaN     NaN
person maxymoo    schedule 04.08.2015
comment
Это может сработать, но я не могу подтвердить это, так как не знаю, как изменить список данных на сохраненные строки из output.csv. Я пытался последние 6 часов, но все, что я пробую, по-прежнему ошибается: tagged_addresses = [usaddress.parse (line) for line in data] - person JoeB; 04.08.2015
comment
вы можете читать свои данные с помощью pandas: data = pd.read_csv('output.csv')['Case Parties Address'] - person maxymoo; 05.08.2015
comment
Спасибо, но вывод не содержит заголовков и не анализирует данные. Когда я использую address_df.to_csv (), он предоставляет 0-5 для заголовков столбцов, например, группируя (u'THOMAS ',' Streetname ') в одну ячейку. То же самое происходит, когда я напрямую использую ваш исходный код. Есть ли модуль, который мне нужно импортировать? Похоже, нам не хватает заголовка LABELS в модуле usaddress. Спасибо еще раз. - person JoeB; 05.08.2015
comment
Можете ли вы опубликовать (анонимную версию) первые несколько строк файла output.csv в своем вопросе? - person maxymoo; 05.08.2015
comment
Вот и все! :) Я также не могу воспроизвести исходную таблицу вывода панд вашего поста. Спасибо!! - person JoeB; 05.08.2015