我正在将我的scrape输出到.csv,但我正在将同一个蜘蛛的多个实例输出到相同的.csv。这会导致重复标头,这会导致数据库插入问题。
我发现here如何完全摆脱标题,但他的解决方案只有在文件中已有内容时才能消除它们似乎不起作用。我只是在那里评论,但我的名声不够高。
是否有人知道如何只将列标题打印到文件一次?
我已经尝试过测试他的解决方案,似乎args [0] .tell()总是等于0,所以它永远不会进入if语句。看起来这是如此接近,我只是不知道如何判断文件中是否有内容。
答案 0 :(得分:0)
我会将上述答案中的代码更改为以下内容:
来自scrapy.exporters的导入CsvItemExporter
class HeadlessCsvItemExporter(CsvItemExporter):
def __init__(self, *args, **kwargs):
# args[0] is (opened) file handler
# if file is not empty then skip headers
if os.fstat(args[0].fileno()).st_size > 0:
kwargs['include_headers_line'] = False
super(HeadlessCsvItemExporter, self).__init__(*args, **kwargs)
或者,您可以在不使用os
模块的情况下执行此操作:
导入CsvItemExporter
class HeadlessCsvItemExporter(CsvItemExporter):
def __init__(self, *args, **kwargs):
# args[0] is (opened) file handler
# if file is not empty then skip headers
args[0].seek(0,2)
if args[0].tell() > 0:
kwargs['include_headers_line'] = False
super(HeadlessCsvItemExporter, self).__init__(*args, **kwargs)
在seek
函数中,第一个参数是要寻找的偏移量(在这种情况下0
是什么都没有),第二个参数2
意味着它应该从结束时开始寻找文件。结果是文件处理程序位置跳转到文件末尾,然后tell
按预期工作。