import csv

1. 多余的空行

原因

python正常写入文件的时候,每行的结束默认添加’\n’,即0x0D,而writerow命令的结束会再增加一个0x0D0A,因此对于windows系统来说,就是两行。采用’ b’参数,用二进制进行文件写入,系统默认是不添加0x0D的(故python2.x中的解决方式是使用“wb模式打开文件”,该方法python3.x中已不适用,会报错如下)。

TypeError: a bytes-like object is required, not 'str'

解决方法

打开待写入文件时添加newline=“”。例如。

with open(filename,"w",encoding="utf-8",newline="") as csvfile:writer = csv.writer(csvfile)writer.writerows(csv_list)

writerow()和writerows()区别


2. BOM对读写的影响

(1)什么是BOM

BOM(byte-order mark,字节顺序标记):
Unix系统中都是使用的utf-8编码,所以在Mac用open打开utf-8编码的csv文件并不用加encoding=“utf-8”。

with open(filename) as csvfile:reader = csv.reader(csvfile)content = [row for row in reader]

Windows系统的中文环境很多软件默认字符编码为gbk,比如如果用上面的语句打开csv文件则会报错。

'gbk' codec can't decode byte

这种情况可以指定编码为“gbk”来读取:

with open(filename, encoding='gbk') as csvfile:reader = csv.reader(csvfile)content = [row for row in reader]

而utf-8保存的文件要用Excel正常打开的话(不乱码),必须在文件最前面加入BOM(Mac、Windows都是)。

*Mac下用Excel处理过的utf-8编码csv文件也会带BOM头哦

(2)读取带有BOM头的csv文件

问题:首行出现“\ufeff”

如果不处理,读取的列表中,第一项最前面会多“\ufeff”几个字母。如果这一项再作为内容被写入csv,则首行最前面会好像出现了乱码。

解决方法

打开文件时的encoding = “utf-8” 改为encoding = “utf-8-sig”。

with open(filename,"w",encoding="utf-8-sig",newline="") as csvfile:reader = csv.reader(csvfile)content = [row for row in reader]

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


(3)写入带有BOM头的csv文件

不带BOM头的csv文件用Excel打开中文会乱码,Notepad++打开不会乱码。
用Excel打开:

用Notepad++打开:

写入csv文件时写入BOM头的方法:

方法一:编码改为“utf-8-sig”。

这个方法在mac下没问题,windows下好像以前试过不行,所以后来又找了方法二。

with open(filename,"w",encoding="utf-8-sig",newline="") as csvfile:writer = csv.writer(csvfile)writer.writerows(csv_list)

方法二:在写入文件内容之前写入二进制的 “\xef\xbb\xbf”

import codecs
with open(filename,"wb") as csvfile:csvfile.write(codecs.BOM_UTF8) # 或csvfile.write(b“\xef\xbb\xbf)

注意使用python3时,这里的打开模式只能是”wb“(写入二进制文件),不能是”w“,否则会报错:

TypeError: write() argument must be str, not bytes

一个完整的加BOM头写入方法:

1、先用”wb“模式写入BOM头
2、再用”a“(追加)模式写入正文

with open(filename,"wb") as csvfile:csvfile.write(b"\xef\xbb\xbf")
with open(filename,"a",encoding="UTF-8",newline="") as csvfile: writer = csv.writer(csvfile)writer.writerow(rows)

3. csv.reader读取的内容只能使用一次

with open("test.csv",'r',encoding="UTF-8",newline="") as csvfile:reader = csv.reader(csvfile)col1 = [row[1] for row in reader]col2 = [row[2] for row in reader]

这样读出来col2会是空值。因为出于节省内存的原因,reader中的内容被读取一次后就会释放。如果确实需要两列分开读,那么就先把reader中需要的内容全部读出来,再分别用不同的变量表示。

with open("test.csv",'r',encoding="UTF-8",newline="") as csvfile:reader = csv.reader(csvfile)rows = [row for row in reader] # 把reader中需要的内容都读出来col1 = [row[0] for row in rows] # 从rows中读取col2 = [row[1] for row in rows] # 从rows中读取

4. 其他

(1)读取写入模式

r:只读,文件不存在则报错
r+:可读可写,文件不存在则报错,覆盖
w:只写,文件不存在则创建,覆盖
w+:可读可写,文件不存在则创建,覆盖
rb,wb:类似w,r,用于二进制文件读写
a:只写,文件不存在则创建,追加
a+:可读可写,文件不存在则创建,追加

(2)指针

  1. 每次打开文件默认指针是在开头的。可以通过file.tell()查询当前指针位置,file.seek()来设置指针的位置进行读写操作。
  2. 在打开的文件中(一个with open内部),每次操作都是从当前指针指向位置向后进行读写,读写完成指针停留在当前文档的最后。

(3)报错: _csv.Error: field larger than field limit (131072)

原因:读取的csv文件有的字段(单元格)里的字数太多,超出限制
解决:在读取csv文件之前修改最大限制:

csv.field_size_limit(500 * 1024 * 1024)
#或者
csv.field_size_limit(sys.maxsize)

其中sys.maxsize值为9223372036854775807=2^63-1,是64位系统下有符号整型最大值。


最后

这些都是最近做数据处理过程中遇到的问题,如果有不对的地方欢迎大家批评指正,共同学习。

「Python数据分析」CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)相关推荐

  1. python对文件的读操作有哪些方法-Python中文件的读取和写入操作

    从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...

  2. python对文件的读操作方法有哪些-Python中文件的读取和写入操作

    从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...

  3. csv文件加bom python_CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)

    import csv 1. 多余的空行 原因 python正常写入文件的时候,每行的结束默认添加'\n',即0x0D,而writerow命令的结束会再增加一个0x0D0A,因此对于windows系统来 ...

  4. python读数据-用 Python 的输入输出功能读取和写入数据

    读取.写入和 Python 在 "探索 Python 系列" 以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如 tuple . string 和 list ...

  5. python编程a的x次方_「Python 面试」第四次更新

    阅读本文大约需要 5 分钟. 15.说一说 GIL 前面有提到由于 Python 基于 C 语言编写的解释器中设置了一个 GIL 全局变量锁,该锁使得 Python 的多线程在处理 CPU 计算密集型 ...

  6. mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例

    #开往春天新创作大赛# 前言 列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导, ...

  7. Python 两种csv文件的写入方式

    在学习使用python去读写csv文件时,发现有如下这两种方式 1.普通写入 import csv #引入csv# 需要输出的数据组,'8_1'中[8]是工人工号,[1]是其所在工位,后面两数字是开始 ...

  8. python 利用os库 读取、写入txt文本

    目录 读写模式 1.读取txt文本 1.1read() 一次性读全部内容 1.2readline()    读取第一行内容 1.3readlines()     列表 1.3.1直接输出 1.3.2f ...

  9. Python文件打开,读取与写入

    打开文件 open是Python打开文件的一个途径, 它不需要经过import的调用直接可以使用. 它的基本用法如下: open("文件名称"+"文件后缀(格式)&quo ...

最新文章

  1. 无偏方差为什么除以n-1
  2. 解决cisco路由器cpu占用率100%问题
  3. win7系统升服务器版本,WIN7专业版可update补丁,WIN7旗舰版无法update补丁,WSUS服务器是按windows类型还是版本区别updata的还是其他什么方式...
  4. 如何在Membership中实现修改密码的功能
  5. app应用内嵌h5页面怎么直接打开safari_localstroage过多存储满的情况下应该怎么办?...
  6. Linux中VI中看时间,Linux中vi的使用
  7. atan与atan2的区别
  8. windows远程连接linux-安装xfce界面,ubuntn添加新用户
  9. 开源推荐:.Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统
  10. spring 注释_Spring核心注释
  11. 奖品好low !! -- 说说开源中国oschina的年度评选
  12. 初识openwrt(上)
  13. 【报告分享】2020中国CRM指数测评报告.pdf(附下载链接)
  14. 云服务器选ssd还是hdd_云服务器区域怎么选?
  15. OpenCV图像处理(2)——形态学操作
  16. Hdu2612Find a way bfs
  17. 2022官网下载jdk8教程
  18. 打开cad图纸计算机打不开,cad打不开_CAD图纸打开未响应怎么解决
  19. 年终工作总结汇报和述职报告ppt模板,内含范文可参考,精选20套可下载
  20. mysql学习笔记 51_mysql学习笔记

热门文章

  1. nginx 排除 部分地址_在设计排除部分文化的图标时重新设计图标
  2. 清华大学海洋大数据分析管理平台解读
  3. 手游代理怎么做?看看这些就知道了
  4. 微盟程序员删库跑路,被判刑六年!
  5. 净值继续回落,短期弱势难改
  6. 如何选择指针中置空?NULL, nullptr, 0?
  7. web文件被更改crawlergo怎么解决_xray+Crawlergo联动实现批量检测--守株待兔
  8. 爬虫实例之豆瓣电影排行榜
  9. python的内置字典数据类型_python 数据类型元组与字典内置方法
  10. 4种高速安全混合云解决方案,助力您的云迁移之旅