Scrapy之CsvItemExporter生成的CSV文件乱码解决

2023-10-27

环境信息

Python 3.6.5
Scrapy 2.2

导出文件逻辑

self.file = open("/Users/chenjunfeng02/Downloads/enrolldata.csv", "wb")
        self.exporter = CsvItemExporter(self.file,
                fields_to_export=["provinceCode", "provinceName", "collegeCode", "collegeName"])
        self.exporter.start_exporting()

上述代码,可以正常导出数据内容,但是导出的内容,使用Excel打开之时,确是显示为乱码。
针对这些乱码的处理办法,如果使用excel自身的能力,则可以参阅笔者前一篇的文字自行转换处理Excel解决CSV文件中的乱码
如何从代码层面直接将其写入为正确的编码呢?

尝试1: 文件写入的模式

这里使用open打开文件,是否可以在这里设置encoding模式呢?尝试如下:

self.file = open("/Users/chenjunfeng02/Downloads/enrolldata.csv", "w", encoding="utf-8")

正常情况下,是可以设置其写模式,设置encoding编码。
但是在Scrapy中要求使用而二进制模式写入,即文件打开的模式需要使用"w+b"。在二进制模式下,是不能设置encoding的编码格式的,所以这条路行不通…
既然是二进制写入模式,那就意味着CsvItemExporter本身是先将Item转换为文本,然后再按照二进制流方式写入文件的,即可以在CsvItem转换过程中,处理编码转换问题。查看官方文档:

class scrapy.exporters.CsvItemExporter(file, include_headers_line=True, join_multivalued=',', **kwargs)
Parameters:
        file – the file-like object to use for exporting the data. Its write method should accept bytes (a disk file opened in binary mode, a io.BytesIO object, etc)
        include_headers_line (str) – If enabled, makes the exporter output a header line with the field names taken from BaseItemExporter.fields_to_export or the first exported item fields.
        join_multivalued – The char (or chars) that will be used for joining multi-valued fields, if found.

没有发现合适的参数,可以查看基类:BaseItemExporter

class scrapy.exporters.BaseItemExporter(fields_to_export=None, export_empty_fields=False, encoding='utf-8', indent=0, dont_fail=False)

其中encoding的说明如下:

The encoding that will be used to encode unicode values. 
This only affects unicode values (which are always serialized to str using this encoding).
 Other value types are passed unchanged to the specific serialization library.

正确做法

self.file = open("/Users/chenjunfeng02/Downloads/enrolldata.csv", "wb")
        self.exporter = CsvItemExporter(self.file, encoding='utf-8-sig',
                fields_to_export=["provinceCode", "provinceName", "collegeCode", "collegeName"])
        self.exporter.start_exporting()

编码格式说明

”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.
“uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”, 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.

实际测试了一下,使用utf-8写入仍然会出现乱码,正确的做法是使用utf-8-sig.
关于utf-8-sig常见的异常问题:
FileNotFoundError: [Errno 2] No such file or directory: ‘\ufeffA.txt’
这里的\ufeff即为所属的签名信息。

参考文档

  1. Scrapy官方
  2. "\ufeff"字符串处理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy之CsvItemExporter生成的CSV文件乱码解决 的相关文章

随机推荐

  • sql server 存储过程中输入参数需要用in而失效的问题解决方案

    在存储过程中使用IN函数 传入多个参数时 会有问题 因为输入参数 1 2 3 是一个数据 而不是一个集合 导致sql失效 三种解决方案 1 建立函数分割输入参数里面的 create FUNCTION dbo Split2 RowData v
  • mac下编译protobuf c++

    由于protobuf官网的文档是英文版的 并且并没有比较详细的说明 可能说得很清楚了 只是我这种英文渣看不懂 学习起来着实费了一翻功夫 在此 记录一下学习过程 希望尽量详细 一 编译过程需要的工具 1 protobuf源码 下载地址 htt
  • 【HTML+CSS】之CSS布局

    常用布局方式 table 表格布局 float 浮动 margin inline block 布局 flexbox布局 1 flexbox 布局
  • WebDav的几种应用方法

    windows系统将阿里云盘挂载成本地磁盘使用 1 获取阿里云盘的登录token 2 使用脚本程序运行起来webdav aliyundriver的jar包 3 使用RaiDrive软件将阿里云盘挂载成本地磁盘 4 需要注意的是 token的
  • 分布式存储Ceph中的逻辑结构Pool和PG

    Ceph中的逻辑对象有Object Pool PG 本文简单介绍相关的概念以及之间的关系 PG状态变化过程等 1 Ceph集群中的逻辑结构 1 1 Object Object是Ceph的最小存储单元 大小可以自己定义通常为2M或4M 每个O
  • 某网站登录接口password参数还原

    本次分析的网站 aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4 cmVkaXJlY3Q9JTJGbXk 1 抓包 本次需要分析的是 password 参数 所以 在控制台全局搜索 pa
  • 12000+套Midjourney描述词!有了它真的可以为所欲为!

    今天给各位来个猛的 更新一些最新最全的Midjourney关键词 方便大家在AI绘画中使用 有了这些关键词你可直接复制粘贴拿过来稍加修改就可以用了 当然这些关键词不仅仅只适合Midjourney这个平台 其他AI类绘画工具同样适用 Midj
  • 引用传递的参数类型,加不加ref是不同的

    教科书上说引用传递的参数引用时 加不加ref都可以 都会改变参数原来的值 值传递参数引用时如果想要改变原来的值 必须加ref 以前遇到的大部分情况确实是如此 引用传递类型比如ArrayList DataTable到另一个方法中 并在该方法中
  • 关于腾讯云短信sms接口自定义API写法 PHPdemo

    腾讯云短信 Short Message Service SMS 接口自定义API写法 PHPdemo 问题1 调试时 参数必须是真实的 这样才能一次到位 比如我 故意短信签名 填个错的 这样不扣量 提示个 FailedOperation S
  • IDEA快捷键

    Ctrl Shift Enter 语句完成 否定完成 输入表达式时 键 Ctrl E 最近的文件 Ctrl Shift E 最近更改的文件 Shift Click 可以关闭文件 Ctrl OR 可以跑到大括号的开头与结尾 Ctrl F12
  • Yii Framework 开发教程(1) 第一个应用Hello World

    Yii Framework 教程可以参见官方中文文档 那么为什么还要写这个开发教程呢 本教程目的是通过不同的视角 主要是通过开发Windows应用C C 程序员的角度 帮助Windows 桌面应用或ASP Net程序员较快的掌握PHP Yi
  • C++用 _findfirst 和 _findnext 查找文件

    一 这两个函数均在io h里面 二 首先了解一下一个文件结构体 struct finddata t unsigned attrib time t time create time t time access time t time writ
  • ipv6地址为什么显示两个_基本IPv6故障排除命令/ IPv6 Rosetta Stone 2019

    这篇文章旨在概述Windows Linux和macOS这三个主要操作系统的基本IPv6故障排除方法和命令 对于这些操作系统 仅适用于某些特定任务 它包括 IPv6 Rosetta Stone 的更新版本 这是我经常向IPv6初学者介绍的网站
  • 怎么用计算机上的打印设备打印,电脑中怎么添加打印机设备

    电脑中怎么添加打印机设备 电脑中怎么添加打印机设备呢 下面小编介绍一下 具体如下 1 打开电脑 点击 控制面板 图标 2 在如图页面 找到 硬件和声音 点击打开 3 然后点击 设备和打印机 选项 4 打开后 点击上方的 添加打印机 5 最后
  • 递归解题思维

    目录 开篇 用递归解题的意义 递归思维与数学归纳法 递归解题的类型 递归结题步骤 递归例题 1 求N阶乘 2 找出数组中的最小值 3 字符串翻转 小结 开篇 网上关于如何用递归解决问题方法的文章很多了 看了一些 我也来谈谈我的看法 很多文章
  • elementui 更换主题色

    定义CSS变量 由var 函数来获取值 设定值 root background color FF0000 获取值 div background color var background color JS获取变量 const element
  • c语言进行菜单制作

    include stdlib h include
  • Lecture11: (增强)拉格朗日松弛技术

    目录 1 理论背景 2 数学分析 3 LR计算案例 3 1 分解 3 2 算法 4 ALR计算案例 4 1 主要思想 4 2 ADMM 当你的问题中包含复杂约束时 你可能需要该方法 本节目标 阐述拉格朗日松弛 增强拉格朗日松弛和交替方向乘子
  • Ubuntu22.04安装Git及配置

    Git安装配置 apt get install git 安装Git git version 安装成功后显示版本 git version 2 34 1 git config global user name name 配置用户名 git co
  • Scrapy之CsvItemExporter生成的CSV文件乱码解决

    环境信息 Python 3 6 5 Scrapy 2 2 导出文件逻辑 self file open Users chenjunfeng02 Downloads enrolldata csv wb self exporter CsvItem