python处理csv文件问题解决贴

摘要:
用excel保存csv格式的文件似乎不可行。在绝望中,我想到了蟒蛇。幸运的是,Python已经有支持csv读写的模块,使用起来非常方便。)在百度的帮助下,网上的解释是python 3不支持以二进制模式读取文件,而python 2不存在这个问题。幸运的是,该机器同时安装了python 3和python 2的两个版本,因此它被替换为python 2.7,问题得到了解决。一个小小的csv文件处理,意外遇到这么多波折,最终坚定不移地解决,并不容易。

实际工作中,碰到这么个问题:有个软件跑在linux系统上,其中用到一个数据库是csv格式的,但要向这个数据库添加600行新的数据,数据源同样是一个csv格式的文件。

有了目标,开始干活。首先想到的是,把linux系统上的数据表给down下来,用excel打开。想法很丰满,现实很骨感。悲催的是,excel的表单保存成csv格式的文件后,原来添加的改动全部没了,而且里面的数据发生了很大的变动,有一列全部变成一样的值了。

看来用excel保存为csv格式的文件是行不通的。

无奈之下,想到了python。所幸python早已有支持csv读写的模块,用起来也甚是方便。

python程序如下:

import csv
fObj=open('test.csv','r')
csvReader=csv.reader(fObj)
sheet=[]
for row in csvReader:
    sheet.append(row)
fObj.close
writeFileObj=open('result.csv','a')
write=csv.writer(writeFileObj)
for row in sheet[40003:]:
    writer.writerow(row)
writeFileObj.close()

这里写文件的格式要用a,表示追加写入,会保留文件内容,将新数据添加到文件末尾,如果使用的是'w'方式,则会清除原有的文件内容。

好了,很快得到我们想要的数据表,上传到linux设备,在linux打开一看,新加的数据每一行都多了一个^M,看起来甚是碍眼,网上百度了一下,发现:

1 1. 在windows下的文本文件的每一行结尾,都有一个回车('
')和换行('
') 
2 2. 在linux下的文本文件的每一行结尾,只有一个回车('
'); 
3 3. 在Mac下的文本文件的每一行结尾,只有一个换行('
');

因此,在linux打开在windows下编辑过的文本,会在行末显示^M

^M在Linux中对应的输入是ctrl+V,ctrl+M。

解决办法也很多样化,个人试过比较好用的方法是用文本替代的方法。使用vim打开csv文件,输入Esc+:,在输入状态输入:

%s/^M$//g

解释:% 指匹配整个文件,s 是置换的意思,^M 注意要用 Ctrl + V Ctrl + M 来输入,M 后面的 $ 代表匹配行尾的内容,最后的 g 则表示每行中匹配到的内容都要置换;

问题得到解决。以为到此结束了,结果程序一运行,新加的数据无法读取,读取出现乱码。数据出现了一堆问号。突然想到,是否应该以二进制的方式来读取文件会比较合理,然后也以二进制的方式写入csv文件。百度了一下,以普通方式读写文件和以二进制方式读写文件的区别如下:

读文件 进行读文件操作时,直到读到文档结束符(EOF)才算读取到文件最后,Python会认为字节x1A(26)转换成的字符为文档结束符(EOF),
      故使用'r'进行读取二进制文件时,可能会出现文档读取不全的现象。
示例:
     二进制文件中存在如下从低位向高位排列的数据:7F 32 1A 2F 3D 2C 12 2E 76
     如果使用'r'进行读取,则读到第三个字节,即认为文件结束。
     如果使用'rb'按照二进制位进行读取的,不会将读取的字节转换成字符,从而避免了上面的错误。
解决方案:
     二进制文件就用二进制方法读取'rb'
  总结:
     使用'r'的时候,如果碰到'0x1A',就视为文件结束,就是EOF。使用'rb'则不存在这个问题

于是把代码中的文件打开方式由'r'变成了'rb‘,写入同样由'a’变成了'ab',运行python,结果报错:

iterator should return strings, not bytes (did you open the file in text mode?)

借助百度,网上的解释是python3不支持以二进制方式读取文件,而python2不会有这个问题,幸好本机同时装了python3和python2两个版本,于是换成python2.7,问题得到解决。

重新把新的数据上传到linux设备上,软件可以正常运行。

一个小小的csv文件处理,竟然遇到这么多波折,最后不屈不挠地解决了,也是不容易。谨以此文MARK一下。

免责声明:文章转载自《python处理csv文件问题解决贴》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【洛谷P5633】最小度限制生成树LINUX系统配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python打开文件报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape

#path 是文件路径 f=open('C:UsersjingqiuDesktopNew Text Document.txt') 结果报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX esc...

Python描述符 (descriptor) 详解

1、什么是描述符? python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 __get__(), __set__(), 和__delete__()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符。 描述符,用一句话来说,就是将某种特殊类型的类的实例指派给另一个类的属性(注意:这里是类属性...

关于跨平台的一些认识

前段时间看了 周志明的那本 《深入理解java虚拟机》。对于平台无关性问题,有了一些新的认识。所以特写一篇博客来进行总结。 这是我的第一篇不针对具体技术,而只针对计算机系统和原理的博客文章,而这种话题,总是比较宽泛,而我本人的水平有限,所以我也只能泛泛的写写,思考的不对的地方,还望读者不吝批评。 C为什么不能跨平台 咱们先来讨论一下,C语言的执行过程,从而...

总线(BUS)和计算机的字长

1.总线(BUS) 总线(BUS)是指计算机组件间规范化的交换数据(data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。从另一个角度来看,如果说主板(Mother Board)是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,传输来回不停运作的比特(bit)。这些线路在同一时间内都仅能负责传输一个比特。因此,必须同时...

python下安装 setuptools 和pip(python环境刚部署好)

起因:换了一台电脑,部署python环境,练习爬虫。然而,还没开始敲代码,就先安装各种第三方包,就想到了pip 安装利器。 官网下载好了pip压缩包,解压后在pip目录下执行命令:python setup.py install,报错提示:缺少setuptools 文件t。接着就开始搞setuptools,一番折腾,终于搞定。 特意将操作的过程记录下来。 1...

python selenium 基本常用操作

 最近学习UI自动化,把一些常用的方法总结一下,方便自己以后查阅需要。因本人水平有限,有不对之处多多包涵!欢迎指正! 一、xpath模糊匹配定位元素 武林至尊,宝刀屠龙刀(xpath),倚天不出(css),谁与争锋  学会了xpath,妈妈再也不用担心我定位不到元素啦 ^_^ # coding:utf-8 import time from seleniu...