近日接到老婆大人的作业,想自动处理一批文件。刚好我自己公司的同事也有类似的需求。想到当初学PYTHON时的一句流行话“人生苦短,我用python。”抱着试试的想法,我开始了这个项目,其中也参看了各位大神的文章,收益良多,在此不一一感谢,我把我经历的一些事和程序与大家分享。
本人双专业,一个是机械自动化,一个是计算机科学技术。现在工作是搞机械设计,业余搞搞编程和电子。编写的程序不一定入得了大神的法眼,还请不要拍砖。
老婆对这个程序的大概要求如下:
1.一批文件,要求自动合并,一次性读取。
2.自动删除表头前5行,表尾。
3.文件含有“50”的特殊行删除。
4.表格删除空白处,并自动对齐。
5.表格旋转90度。
我分析了一下要求,一批文件,批处理应该不难,我查看了各个文件,行数和列数格式都一样,我可以先从单个文件处理入手。读取文件我就直接使用了
c = open("NT1891.CSV","rt",encoding="gbk") #以rt的方式打开csv文件 read = csv.reader(c)
接下来,我使用循环语句,先建立一个空表,再用for语句依次读取,再读取整个表的长度a。
遍历整个文件如下:
data = [] for line in read: data.append(line) #得到列表 a = len(data)
考虑删除表头前5行,由于是固定位置,固定行数,我就偷了一下懒,直接while循环,删除前5行
i = 4 while i >= 0: data.pop(i) i = i-1 b = len(data) #去表头的列表长度
参数b是留着自己参考的,其中有一个大坑,data.pop.后面再说
考虑删除表尾,直接while循环
while (b-1) >= 617: data.pop(b-1) b = b-1
617这个数字是计算得来的,比较笨,当时一直没想明白那个坑,所以不得以,先让程序运行起来。
如何删除含有“50”数字的行,一直研究了好几个晚上。
第一种想法是FOR循环, if判断然后再删除行。
第二种方法是使用 data.pop来删除,一开始试了几行,可行,没问题。但是问题来了,我一使用FOR循环,程序就报错,超出范围,试了好久都不成功
第三种方法是先筛选含有“50"数字的行,保存进列表,然后新表和老表取差,即删除含有”50”数字的行
for d in range(0, len(data)):
if data[d][4] == '50': #注意数值类型
b_list.append(data[d])
new_list = [] #定义新列表为后面两列表相差
for item in data:
if item not in b_list:
new_list.append(item)
for item in b_list:
if item not in data:
new_list.append(item)
事实证明第三种方法高效,程序简洁。
最后把表格旋转90度,这就必须提到NUMPY
代码如下:
a_list = np.array(new_list).T #list类型转为元组类型
#a_list = np.mat(new_list) #这个不知道为什么旋转不了
c_list = list(map(list, zip(*a_list[::1]))) #旋转90度
d_list = np.array(c_list)
print(d_list)
主要功能程序如下:
#coding: utf-8
import csv
import numpy as np
i = 4
c = open("NT1891.CSV","rt",encoding="gbk") #以rt的方式打开csv文件
read = csv.reader(c)
data = []
for line in read:
data.append(line) #得到列表
a = len(data) #原列表的长度
print(a)
while i >= 0:
data.pop(i)
i = i-1
b = len(data) #去表头的列表长度
print(b)
while (b-1) >= 617:
data.pop(b-1)
b = b-1
print(len(data)) #去表尾的列表长度
b_list = [] #定义列表筛选第4列含有50的行
for d in range(0, len(data)):
if data[d][4] == '50': #注意数值类型
b_list.append(data[d])
new_list = [] #定义新列表为后面两列表相差
for item in data:
if item not in b_list:
new_list.append(item)
for item in b_list:
if item not in data:
new_list.append(item)
a_list = np.array(new_list).T #list类型转为元组类型
#a_list = np.mat(new_list) #这个不知道为什么旋转不了
c_list = list(map(list, zip(*a_list[::1]))) #旋转90度
d_list = np.array(c_list)
print(d_list)
c.close()
运行结果如下:符合预期