如何修改Scrapy导出CSV文件的列名?
Scrapy导出CSV自定义列名的解决方案
方案1:自定义CSV导出管道(最灵活)
直接编写管道控制CSV写入逻辑,完全自定义表头与字段映射:
- 在项目的
pipelines.py中添加以下代码:
import csv class CustomCSVExporterPipeline: def __init__(self): self.file = None self.writer = None # 定义原字段名到目标列名的映射 self.field_map = { 'id': 'ID', 'person_name': 'Person Name', 'uniq_code': 'Person Code' } # 指定输出列的顺序 self.fields_order = ['id', 'person_name', 'uniq_code'] def open_spider(self, spider): # 打开CSV文件,设置newline=''避免生成空行 self.file = open('output_custom.csv', 'w', newline='', encoding='utf-8') # 生成自定义表头 headers = [self.field_map[field] for field in self.fields_order] self.writer = csv.DictWriter(self.file, fieldnames=headers) self.writer.writeheader() def process_item(self, item, spider): # 转换Item字段为目标列名对应的数据 row = {self.field_map[field]: item.get(field, '') for field in self.fields_order} self.writer.writerow(row) return item def close_spider(self, spider): self.file.close()
- 在
settings.py中启用该管道,注释原FEED配置避免冲突:
ITEM_PIPELINES = { '你的项目名.pipelines.CustomCSVExporterPipeline': 300, } # 注释默认FEED配置 # FEED = { # 'output.csv': {'format': 'csv'}, # }
方案2:重写Scrapy的CSVExporter类
如果想沿用Scrapy的FEED系统,可继承默认导出器并重写表头逻辑:
- 在项目中新建
exporters.py文件:
from scrapy.exporters import CsvItemExporter class CustomCsvExporter(CsvItemExporter): def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs): self.field_map = { 'id': 'ID', 'person_name': 'Person Name', 'uniq_code': 'Person Code' } super().__init__(file, include_headers_line=include_headers_line, join_multivalued=join_multivalued, **kwargs) def _get_serialized_fields(self, item, default_value=None, include_empty=None): # 替换序列化后的字段名为自定义列名 serialized_fields = super()._get_serialized_fields(item, default_value, include_empty) return [(self.field_map.get(field, field), value) for field, value in serialized_fields]
- 在
settings.py中配置使用自定义导出器:
FEED_EXPORTERS = { 'csv': '你的项目名.exporters.CustomCsvExporter', } FEED = { 'output_custom.csv': { 'format': 'csv', 'fields': ['id', 'person_name', 'uniq_code'], # 控制输出字段顺序 }, }
方案3:导出后批量修改表头(快速临时方案)
若不想修改Scrapy代码,可导出默认CSV后用脚本替换表头:
import csv input_path = 'output.csv' output_path = 'output_renamed.csv' field_map = { 'id': 'ID', 'person_name': 'Person Name', 'uniq_code': 'Person Code' } with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', newline='', encoding='utf-8') as outfile: reader = csv.DictReader(infile) new_headers = [field_map[header] for header in reader.fieldnames] writer = csv.DictWriter(outfile, fieldnames=new_headers) writer.writeheader() for row in reader: new_row = {field_map[old_key]: row[old_key] for old_key in reader.fieldnames} writer.writerow(new_row)
内容的提问来源于stack exchange,提问作者Shahid Karimi
相关产品推荐
相关产品推荐

