我尝试使用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。但我不明白为什么会出现这样的错误。