项目前中期的工作已经完成,因此写这篇博文的目的在于总结项目中有关python操作的一些小问题和小细节,并给出相应的解决方法。
问题一: _csv.Error: field larger than field limit (131072)
原因:当用python读取csv格式文件,excel表数据很大,行数超过131072行,发生情况偶尔,非必然事件。
解决方法:
import sys ''' 解决报错:_csv.Error: field larger than field limit (131072) ''' maxInt = sys.maxsize decrement = True while decrement: # decrease the maxInt value by factor 10 # as long as the OverflowError occurs. decrement = False try: csv.field_size_limit(maxInt) except OverflowError: maxInt = int(maxInt / 10) decrement = True
问题二:处理表格时,程序遍历会出现匹配不上的问题。
原因:有可能excel内容读取出来的时候,单元格里有空格。
解决方法:
for r1 in rows1[1:]: t1 = r1[0].strip()
用 .strip( )就可以去掉空格
问题三:当出现 物品A/物品B/物品C/物品D,假如想要将元素分割,去掉“/”变成物品A/物品B/物品C/物品D,可以不用正则匹配。
解决方法:用 .split 方法 ,linestrlist = linestr.split("/")
问题四:excel表的模糊匹配问题
例子:假如要得到表中所有10kv的项目,用excel/postgre数据库进行数据删选10kv,只是模糊匹配,比如说用10kv字段删选的话,会找出110kv的项目;但是又不能删除110kv,因为有些110kv又包含10kv字段(例:110kv变电站转10kV变电站)
解决方法:
利用excel进行操作
1. 点击“自动删选”——在“项目名称”下拉栏——“内容筛选”输入10kv, 会找出包含110kv的项目。
2. 点击“查找——替换”,输入110kv,替换内容为ttt(可自行设置),也就是用ttt替换110kv。
3. 如1,筛选10kv的项目,放到另外一张新表
4. 如2,将ttt替换成110kv
这个用数据库写sql语句的话很复杂,效果也不见得好,但是用这种替代的思想,往往会有奇效。
问题五:csv格式文件编码问题,表格打开后出现1.2E+111,然后恢复不了原来的数据。
例子:
Csv格式会将“物资编码”列的数字,如010012000395,变成10012000395,即前面的“0”自动去掉,从12位变成11位,不便于后续的操作。(csv格式会自动隐藏,也可以恢复,自行百度);同时如110012000395,前面是“1”的数字,变成csv文件后,数字显示不出来,会出现1.1E+111这种情况。
解决方法:
1.在“物资编码”的数字前加一个“1”,如010012000395,变成了1010012000395
这样可以有效避免数字位数减少的问题。
需要注意的地方,在变成csv格式后,无论是手动变还是python写出来,都要将物资编码这一栏的单元格格式设置成数值。如图所示:
小技巧:
1.在程序遍历匹配的时候出现数字(字符串)匹配不上的问题,可以将两张表的数字(字符串)都强制转换,然后比较。
2.python的一个函数:string.join()
Python中有join()和os.path.join()两个函数,具体作用如下:
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回
1、join()函数
语法: 'sep'.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
3.需要注意的地方:1.慎用excel的去除重复项 2.保存excel文件时优先选择“另存为”,因为当excel进行某些操作后,可能会自动保存为Unicode文本格式,如果不留神点了“保存”,再打开就会出现格式错乱的情况,特别是对格式要求为csv的。