python csv dictionary scrapy pipeline

Organizar un elemento por columna en una fila de archivo csv en scrapy python



dictionary pipeline (1)

La esencia es que esto es muy simple con csv.DictWriter :

>>> inputs = [{ ... "author": ["TIM ROCK"], ... "book_name": ["Truk Lagoon, Pohnpei & Kosrae Dive Guide"], ... "category": "Travel", ... }, ... { ... "author": ["JOY"], ... "book_name": ["PARSER"], ... "category": "Accomp", ... } ... ] >>> >>> from csv import DictWriter >>> from cStringIO import StringIO >>> >>> buf=StringIO() >>> c=DictWriter(buf, fieldnames=[''author'', ''book_name'', ''category'']) >>> c.writeheader() >>> c.writerows(inputs) >>> print buf.getvalue() author,book_name,category [''TIM ROCK''],"[''Truk Lagoon, Pohnpei & Kosrae Dive Guide'']",Travel [''JOY''],[''PARSER''],Accomp

Sería mejor unirse a esas matrices en algo, pero dado que los elementos pueden ser una lista o una cadena , es un poco complicado. Decir si algo es una cadena o algún otro iterable es uno de los pocos casos en Python donde la verificación directa del tipo tiene sentido.

>>> for row in inputs: ... for k, v in row.iteritems(): ... if not isinstance(v, basestring): ... try: ... row[k] = '', ''.join(v) ... except TypeError: ... pass ... c.writerow(row) ... >>> print buf.getvalue() author,book_name,category TIM ROCK,"Truk Lagoon, Pohnpei & Kosrae Dive Guide",Travel JOY,PARSER,Accomp

Tenía elementos que rasparon de un sitio que los coloqué en archivos json como a continuación

{ "author": ["TIM ROCK"], "book_name": ["Truk Lagoon, Pohnpei & Kosrae Dive Guide"], "category": "Travel", } { "author": ["JOY"], "book_name": ["PARSER"], "category": "Accomp", }

Quiero almacenarlos en un archivo csv con un diccionario por fila, en el que un elemento por columna, como se muestra a continuación

| author | book_name | category | | TIM ROCK | Truk Lagoon ... | Travel | | JOY | PARSER | Accomp |

obtengo los artículos de un diccionario en una fila pero con todas las columnas combinadas

Mi código de pipeline.py es

importar csv

class Blurb2Pipeline(object): def __init__(self): self.brandCategoryCsv = csv.writer(open(''blurb.csv'', ''wb'')) self.brandCategoryCsv.writerow([''book_name'', ''author'',''category'']) def process_item(self, item, spider): self.brandCategoryCsv.writerow([item[''book_name''].encode(''utf-8''), item[''author''].encode(''utf-8''), item[''category''].encode(''utf-8''), ]) return item