python - 在scrapy python中的一行csv文件中每列排列一个项目

标签 python csv dictionary scrapy pipeline

我有一些从网站上抓取的项目,我将它们放入 json 文件中,如下所示

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

我想将它们存储在 csv 文件中,每行一个字典,其中每列一个项目,如下所示

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

我将一本字典的项目放在一行中,但将所有列组合在一起

我的pipeline.py代码是

导入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        

最佳答案

要点是,使用 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

最好将这些数组连接到某些东西上,但由于元素可以是列表或字符串,所以有点棘手。判断某个东西是字符串还是其他可迭代对象是 Python 中直接类型检查很有意义的少数情况之一。

>>> 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

关于python - 在scrapy python中的一行csv文件中每列排列一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10816241/

相关文章:

python - 在 Python 2/3 中将 float 打印到 io.StringIO

c# - 在 ASP.Net 中使用 C# 为弹出窗口输出 CSV 文件

python - 根据列表中的元素对列表作为值的字典进行排序

mysql - LOAD DATA LOCAL INFILE 操作一些日期列

python - 将 Python 对象列表减少为 object.id -> object 的 dict

javascript - 声明一个具有显式类型的字典node.js

python - OSX iTerm2 可以将鼠标与 python-ncurses 一起使用,但不能与 C 中的curses一起使用

python - 子类别 list

python - Google App Engine Python 中多个文件中的 URL 映射

c# - TinyCsvParser 不返回任何结果