【问题标题】:Arranging one items per one column in a row of csv file in scrapy python在scrapy python中的一行csv文件中每列排列一个项目
【发布时间】:2012-05-30 12:24:49
【问题描述】:

我有一些从网站上抓取的项目,我将它们放入下面的 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        

【问题讨论】:

  • 如果其中一个列表有多个成员会怎样?
  • 如果您只有一位作者,为什么要使用列表,书籍会有多个名字吗?
  • 我只是举了一个例子,实际上我列出了多个成员,所以当我运行上面的代码时,我得到“TypeError:List has no encode method”。当列表包含多个元素时如何执行此操作。当列表包含一项时,如何在每列中放置一项
  • @shivakrishna,你需要表明你要问这个问题两次和provide a link to the other question

标签: python csv dictionary scrapy pipeline


【解决方案1】:

要点是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

【讨论】:

  • 对不起,我有点糊涂了,上面的例子很清楚,我明白了,但是我们如何在上面的 pipeline.py 代码中实现这一点
  • 我的意思是我需要将其写入 csv 文件
  • 是的,我明白了,如果输入中只有一本字典会怎样
  • @shivakrishna 对不起,我不明白你的意思。
  • 实际上你已经在输入中使用了两个字典,但是如果它有一个字典呢。
猜你喜欢
  • 2015-04-01
  • 2018-12-08
  • 2014-07-26
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多