使用scrapy将项目写入csv文件时遇到问题

时间:2016-11-08 04:38:55

标签: python string csv byte

我尝试使用CsvItemExporter在Scrapy中写入csv文件。 代码在这里:

 class StockPipelineCSV(object):

 def open_spider(self,spider):
     self.file = open('stocks_01.csv', 'w')
     self.exporter = CsvItemExporter(self.file)
     self.exporter.start_exporting()

 def close_spider(self,spider):
     self.exporter.finish_exporting()
     self.file.close()

 def process_item(self, item, spider):
     self.exporter.export_item(item)
     return item

当我运行项目时。我遇到错误:

  

TypeError:write()参数必须是str,而不是bytes

所以我在scrapy中访问exporters.py并查看export_item()方法。代码如下:

#exporters.py  
def export_item(self, item):
    if self._headers_not_written:
        self._headers_not_written = False
        self._write_headers_and_set_fields_to_export(item)

    fields = self._get_serialized_fields(item, default_value='',
                                         include_empty=True)
    values = list(self._build_row(x for _, x in fields))
    self.csv_writer.writerow(values)

def _build_row(self, values):
    for s in values:
        try:
            yield to_native_str(s, self.encoding)
        except TypeError:
            yield s

和to_native_str(s,self.encoding)方法在python.py中:

 #python.py
 def to_native_str(text, encoding=None, errors='strict'):
 """ Return str representation of `text`
 (bytes in Python 2.x and unicode in Python 3.x). """
     if six.PY2:
         return to_bytes(text, encoding, errors)
     else:
         return to_unicode(text, encoding, errors)

所以我认为该项目已经转换为byte.But为什么会出错? 我搜索错误并获得一些解决方案:使用w + b模式打开文件,但文件的内容是凌乱的单词。 之后我尝试编写一个测试代码来写入csv文件:

# coding: utf-8

import csv

csvfile = open('D://t.csv', 'w+b')
writer = csv.writer(csvfile)
writer.writerow([str.encode('列1'), str.encode('列2'), str.encode('列3')])

data = [
    str.encode('值1'), str.encode('值2'), str.encode('值3')
]
writer.writerow(data)

csvfile.close()

我运行它但得到错误:

  

TypeError:需要类似字节的对象,而不是' str'

但我想我已经通过str.encode()将str转换为字节。

我对str和类字节对象非常困惑。我知道byte是ascii代码,str是unicode。但我不明白为什么会出现这样的错误。

0 个答案:

没有答案