Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scrapy python中,在csv文件的一行中每列排列一个项目_Python_Csv_Dictionary_Scrapy_Pipeline - Fatal编程技术网

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

在scrapy python中,在csv文件的一行中每列排列一个项目,python,csv,dictionary,scrapy,pipeline,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文件中,每

我有一些从网站上刮下来的东西,我把它们放到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中,直接类型检查很有意义,判断某个对象是字符串还是其他iterable是为数不多的几种情况之一

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

要点是使用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中,直接类型检查很有意义,判断某个对象是字符串还是其他iterable是为数不多的几种情况之一

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


如果其中一个列表有多个成员,会发生什么情况?如果你只有一个作者,为什么要使用列表?书会有多个名字吗?我只是举个例子,实际上我有多个成员,所以当我运行上面的程序时,我得到了“TypeError:list没有编码方法”。当列表包含多个元素时,如何执行此操作。另外,当列表由一个项目组成时,如何在每列中放置一个项目item@shivakrishna,你需要发出信号,你要问两次这个问题,如果其中一个列表有多个成员,会发生什么?如果你只有一个作者,为什么要使用列表?书会有多个名字吗?我只是举了一个例子,实际上,我有一个以上的成员列表,所以当我运行上面的代码时,我得到了“TypeError:list没有编码方法”。当列表包含多个元素时,如何执行此操作。另外,当列表由一个项目组成时,如何在每列中放置一个项目item@shivakrishna,你需要发出信号说你问了两次这个问题,很抱歉我有点困惑,上面的例子很清楚,我理解,但是我们如何在上面的管道中实现它。py代码我的意思是我需要将它写入csv文件。我明白了,如果你的字典里只有一本呢inputs@shivakrishna对不起,我不明白你的意思。实际上你输入了两个字典,但是如果它有一个字典呢。对不起,我有点困惑,上面的例子很清楚,我明白,但是,我们如何在上面的pipeline.py代码中实现这一点呢?我的意思是,我需要将其写入一个csv文件。我知道了,如果只有一个字典呢inputs@shivakrishna对不起,我不明白你的意思。实际上你在输入中使用了两个字典,但是如果它有一个字典呢。