You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Scrapy导出CSV文件的列名?

Scrapy导出CSV自定义列名的解决方案

方案1:自定义CSV导出管道(最灵活)

直接编写管道控制CSV写入逻辑,完全自定义表头与字段映射:

  1. 在项目的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()
  1. 在settings.py中启用该管道,注释原FEED配置避免冲突:
ITEM_PIPELINES = {
    '你的项目名.pipelines.CustomCSVExporterPipeline': 300,
}

# 注释默认FEED配置
# FEED = {
#     'output.csv': {'format': 'csv'},
# }

方案2:重写Scrapy的CSVExporter类

如果想沿用Scrapy的FEED系统,可继承默认导出器并重写表头逻辑:

  1. 在项目中新建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]
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:55:13