近日接到老婆大人的作业,想自动处理一批文件。刚好我自己公司的同事也有类似的需求。想到当初学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()

    运行结果如下:符合预期

Python 实战 CSV 文件操作

相关文章: