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文件乱码解决 的相关文章

  • 在 Python distutils 中从 setup.py 查找脚本目录的正确方法?

    我正在分发一个具有以下结构的包 mymodule mymodule init py mymodule code py scripts script1 py scripts script2 py The mymodule的子目录mymodul
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • if 语句未命中中的 continue 断点

    在下面的代码中 两者a and b是生成器函数的输出 并且可以评估为None或者有一个值 def testBehaviour self a None b 5 while True if not a or not b continue pri
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 使用 Python pandas 计算调整后的成本基础(股票买入/卖出的投资组合分析)

    我正在尝试对我的交易进行投资组合分析 并尝试计算调整后的成本基础价格 我几乎尝试了一切 但似乎没有任何效果 我能够计算调整后的数量 但无法获得调整后的购买价格有人可以帮忙吗 这是示例交易日志原始数据 import pandas as pd
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 如何为每个屏幕添加自己的 .py 和 .kv 文件?

    我想为每个屏幕都有一个单独的 py 和 kv 文件 应通过 main py main kv 中的 ScreenManager 选择屏幕 设计应从文件 screen X kv 加载 类等应从文件 screen X py 加载 Screens
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 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