zoukankan      html  css  js  c++  java
  • 【原】记录一下第一次使用Python简单处理Excel

    最近遇到过几次需要分析客户发来的业务数据的工作。

    客户是用Excel发来的,分析之前需要把Excel里的数据导入到数据库中,后续会再利用程序对数据做分析。

    现在主要讲一下如何把Excel数据导入到数据库中。

    在导入前,先看看这个Excel数据的格式,发现会有以下几个现象:

    1)第一行的标题,中英文都有,命名比较杂,甚至名称前后还有空格。直接拿用肯定不行,需要在导数据的时候,做一下数据的清洗整理格式转换等。

    2)下面的数据行中,个别列中的数据,也存在冗余的空白字符,还有些日期时间后面会多出不需要的数字,还有些列数据需要根据转换规则转换一下才能用。

    反正就是客户给的数据,不好直接拿就用,需要做数据清洗整理转换。

    以往用的过的方法是:

    1)在excel中,通过公式,去做清理。但是发现如果excel文件多了,也不方便,要每个文件里都要写一次公式,不想写,懒……

    2)通过平时工作中主要使用的C#去写小程序,去处理,第一次感觉还不错,后来发现有点小题大作了。后面反正就是不想写程序了,发现手上写的各种小程序,越来越多,用的频率很低,有些只用过一次。

    3)使用现成的工具,直接把excel数据导入数据库中,再在数据库,用sql去做数据清洗。这个方法用过一次,感觉也不错,和第二种写小程序差不多。

    这次,我想试试Python,10年前就接触了,可是一直没有正儿八经用过他。

    最近老是看到广告,说用Python处理excel多么多么的牛X。

    这次心动了一下,硬着头皮,开始写代码,百度了10几个页面,各种参考学习,最终写出了下面的代码。

    可以根据传入的excel文件名,去对excel文件里的数据,进行简单的解析,数据处理,把处理完的新数据另存为一份新的excel文件。

    用起来还不错,还有许多改进的空间,比较我能想到的有,可以自动遍历当前目录下面的excel文件,不要每次都要传excel文件名作为参数。

    以后有机会再说吧。年纪大了,容易累,容易忘记事,记录一下,防止下次需要用到。

    import sys
    import os
    import xlrd #读excel
    import xlwt #写excel
    
    print(sys.argv)
    if(len(sys.argv) < 2):
        print('请提供原始excel文件名')
        exit(0)
    
    arg = sys.argv[1]
    filename, suffix = os.path.splitext(arg) #分离文件名和后缀
    print(filename, suffix)
    # exit(0)
    
    #判断变量类型的函数
    def typeof(variate):
        type=None
        if isinstance(variate,int):
            type = "int"
        elif isinstance(variate,str):
            type = "str"
        elif isinstance(variate,float):
            type = "float"
        elif isinstance(variate,list):
            type = "list"
        elif isinstance(variate,tuple):
            type = "tuple"
        elif isinstance(variate,dict):
            type = "dict"
        elif isinstance(variate,set):
            type = "set"
        return type
    # 返回变量类型
    
    #打开文件
    book = xlrd.open_workbook(filename + suffix)
    book2 = xlwt.Workbook()
    
    #获取所有sheet的名字
    # print('sheet页名称:', book.sheet_names())
    
    sheet1 = book.sheet_by_index(0)
    sheet2 = book2.add_sheet('Sheet1')
    
    rows = sheet1.nrows
    cols = sheet1.ncols
    print('sheet1有%d行,%d列'%(rows, cols))
    # print('第三行内容:', sheet1.row_values(2))
    # print('第二列内容为%s, 数据类型为%s'%(sheet1.col_values(1), type(sheet1.col_values(1))))
    
    # 复制第一行标题
    for i in range(cols):
        val = sheet1.cell_value(0,i)
        val = val.strip()
        # print(val)
        sheet2.write(0, i, val)
    
    # 尝试解析第一行数据
    for i in range(cols):
        for j in range(rows-1):
            val = sheet1.col(i)[j+1].value
            # print(val, type(val))
            print('.', end='')
            if typeof(val) == 'str':
                val = val.strip() # 移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
                
            # 处理处方号
            if(i == 3):
                val = val.replace('-','').replace('_','')
                val = int(val)
                val = str(val)
    
            # 处理时间后面的小尾巴
            if(i == 4  or i == 7 or i == 11 or i == 12 or i == 15):
                val = val.replace('.0','')
    
            sheet2.write(j+1, i, val)
    
    # save new exlcel file
    book2.save(filename + '_cleaned' + suffix)
    print('excel file saved!')
    
    # 新建excel并保存数据
    # book2 = xlwt.Workbook()
    # sheet2 = book2.add_sheet('Sheet1')
    # sheet2.write(0, 0, 'hello')
    # sheet2.write(1, 0, '你好')
    # book2.save('hello.xls')
    # print('excel file saved!')
    

      

    补充:其实刚开始不想使用Python,因为之前没有用过,比较陌生。

    后来在内心世界里做了一会儿思想斗争——以往确实没有用过什么好的处理excel数据的方法啊,至少感觉还是挺费时间的,这次何不试一试Python。

    慢慢的,发现,越用越感觉不错。感觉可以提升效率,而且这个代码,后续再遇到什么新的需求,也可以改一改,就可以复用了。

    或者后续,我再继续边做新需求,边优化。(发现代码优化这种想法,经常有,但是很少做,一般都是实在看不下去了,再去做)。

  • 相关阅读:
    python随机生成
    socket、tcp、http
    TCP三次握手和http过程
    iOS多线程的初步研究(十)-- dispatch同步
    dispatch队列
    IOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
    UIWebView 自定义网页中的alert和confirm提示框风格
    dispatch_semaphore
    app内购提示,您已购买此商品,但未下载
    单例的写法
  • 原文地址:https://www.cnblogs.com/luqingfei/p/14168076.html
Copyright © 2011-2022 走看看