python处理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. 在windows下的文本文件的每一行结尾,都有一个回车('\n')和换行('\r')
2. 在linux下的文本文件的每一行结尾,只有一个回车('\n');
3. 在Mac下的文本文件的每一行结尾,只有一个换行('\r');
因此,在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文件问题解决贴的更多相关文章
- Python处理csv文件
Python处理csv文件 CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看.由于是纯文本,任何编辑器也都可打开.与Excel文件不同,CSV文件中: 值没 ...
- 使用Python读写csv文件的三种方法
Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...
- python读写csv文件
文章链接:https://www.cnblogs.com/cloud-ken/p/8432999.html Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗 ...
- 使用python读写CSV文件
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/10/25 21:14' import csv with open('resu ...
- 解决python中csv文件中文写入问题
一.前言 一般来说,为了方便,使用python的时候都会使用csv模块去写数据到csv文件,但是写入中文的时候,经常会报错: UnicodeEncodeError: 'ascii' codec can ...
- 【Python】Python处理csv文件
Python处理csv文件 CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看.由于是纯文本,任何编辑器也都可打开.与Excel文件不同,CSV文件中: 值没 ...
- Python读取CSV文件,报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 727: illegal multibyte sequence
Python读取CSV文件,报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 727: illegal mul ...
- python 生成csv乱码问题解决方法
需求背景 最近为公司开发了一套邮件日报程序,邮件一般就是表格,图片,然后就是附件.附件一般都是默认写到txt文件里,但是PM希望邮件里的附件能直接用Excel这种软件打开,最开始想保存为Excel,但 ...
- python导入csv文件时,出现SyntaxError
背景 np.loadtxt()用于从文本加载数据. 文本文件中的每一行必须含有相同的数据. *** loadtxt(fname, dtype=<class 'float'>, commen ...
随机推荐
- Ubuntu上64位adv无法创建问题
Ubuntu上安装android开发环境,前面都成功了,但到了最后创建adv的时候却总是失败. 出现了这个问题.最后,上网找了这个教程http://blog.sina.com.cn/s/blog_66 ...
- TinyXML2的使用
-----------------------------------------------------------------2015年7月21日16:37:53----------------- ...
- Akka(35): Http:Server side streaming
在前面几篇讨论里我们都提到过:Akka-http是一项系统集成工具库.它是以数据交换的形式进行系统集成的.所以,Akka-http的核心功能应该是数据交换的实现了:应该能通过某种公开的数据格式和传输标 ...
- Android模仿iOS iMessages10照片选择器的实现
不知不觉已经接近半年多没有写过博客了,这段时间,也是我刚好毕业走出校园的时间,由于学习工作的原因,一直没有真正静下心来写下些什么东西.这个星期刚入了小米笔记本pro的坑,本着新电脑新生活的理念嘻嘻-- ...
- Python中time和datetime模块的简单用法
python中与时间相关的一个模块是time模块,datetime模块可以看为是time模块的高级封装. time模块中经常用到的有一下几个方法: time()用来获取时间戳,表示的结果为从1970年 ...
- 【WEB API项目实战干货系列】- WEB API入门(一)
这篇做为这个系列的第一篇,做基本的介绍,有经验的人可以直接跳到第二部分创建 ProductController. 创建 Web API 项目 在这里我们使用VS2013, .NET 4.5.1创建 ...
- winform音频播放器(有声小说[凡人修仙传])
该程序采用多线程的技术及DataGridView单元格扩展的技术 1.获取下载列表 private void GetDownList() { //System.Web.HttpUtility.UrlD ...
- EF动态拼接查询
1.业务中遇到个问题,需要查询如某表的id为1或者2或者3,这里是根据传递参数获取如:传递1,2或者1,3或者1,2,3这里在sql中很好拼接如下: or id= or name=3//3代表另一个字 ...
- 你有什么理由还不选择阿里云服务器呢--从阿里云发布自研商用关系型数据库POLARDB想到的
最近几天,阿里云发布自研商用关系型数据库POLARDB的消息可谓是重磅炸弹啊.借用官方宣传的话就是:6倍性能于MySQL并100%兼容/100TB存储容量/2分钟创建只读副本/3分钟创建容灾实例,第三 ...
- ace_tree总结。各类问题解决办法汇集
首先讲一下怎么使用,然后讲一下出现的问题的解决办法 1.引用js和css文件 ace-extra.min.js.ace.min.css.fuelux.tree.min.js.ace-elements. ...