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 ...
随机推荐
- git clone 带用户名密码的形式但包含@等特殊符号无法正常解析
正常使用git clone 的方式 git clone https://remote 使用带用户名密码的方式(可以避免后续每次都要输入用户名密码) git clone https://[usernam ...
- Android 开发笔记___alertDialog
public class AlertActivity extends AppCompatActivity implements OnClickListener { private TextView t ...
- Problem D: 栈小游戏
#include <iostream> #include <vector> #include <stack> #include <algorithm> ...
- iOS隐藏导航栏底部灰线
首先创建 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #de38a5 } span.s1 { } span.s ...
- Windows系统安装MySQL
在Windows中安装mysql不够幸运的话,会遇到相当多的坑,当然这也算是一种财富吧,让自己碰到问题去查找解决方案.有时候不是一时半会就可以解决的.有同学说过安装mysql安装两天还没有装上.不用担 ...
- (二): 基于ZeroMQ的实时通讯平台
基于ZeroMQ的实时通讯平台 上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍 通讯平台作为 ...
- vue 集成 axios 发送post请求 payload导致后台无法接收到数据问题
vue 集成axios之后,发送的post请求默认为payload 方式. 如果想改为正常的方式,需要增加headers头,并且将发送是数据json格式改为 querystring的方式. 安装依赖 ...
- Scrum Meeting Alpha - 4
Scrum Meeting - NewTeam // 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 确定了API部分的目录结构及包装方式,完成了部分API的包装https:// ...
- Hibernate框架学习之注解映射实体类
前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...
- 动态加载js css 插件
简介 动态加载js,css在现在以及将来肯定是很重要的.目前来看前端代码编写的业务量已经远远超过后端编写的.随着对用户体验度逐渐增强,前端业务复杂,加载速度变得很慢很慢.为了解决这个问题,目前出现的两 ...