美文网首页LyndonPyProjPython学习日志我爱编程
Python数据分析基础ReadingDay3_csv读写

Python数据分析基础ReadingDay3_csv读写

作者: 放翁lcf | 来源:发表于2018-03-15 23:56 被阅读111次

    reading Foundations for Analysis with Python

    foundationsForAnalyWithPyBookCover.png

    这篇笔记主要讲csv文件的读取和写入,还有读取后对数据进行的处理。在上一篇笔记里,用两段代码作为例子简单说明了文本文件的读写,回顾请戳Python数据分析基础ReadingDay2_容器,csv也是一种文本文件,《Python数据分析基础》中说:

    CSV(comma-separated value,逗号分隔值)文件格式是一种非常简单的数据存储与分享 方式。CSV 文件将数据表格存储为纯文本,表格(或电子表格)中的每个单元格都是一个 数值或字符串。

    具体关于csv的介绍可以参考百科

    程序处理的一般为内存中的数据,这样程序运行完之后数据就消失了,因此一般对于重要的数据会将其保存为文件等物理格式。文件的读写对于数据分析是非常重要的,《Python数据分析基础》的第二章通过一些具体的代码讲了csv文件的读写,整体思路为:普通方式读写csv文件、用csv库读写、用pandas库读写、读写数据进入内存后的数据筛选和统计量计算。本篇笔记沿用这个思路。

    目录

    • 普通方式读写csv
    • 用csv库读写
    • pandas库读写
    • 读入后的数据处理

    普通方式读写

    读写文件的整体流程是:打开文件-->按行读入数据-->全部或部分保存到容器中-->关闭文件-->对内存中的数据进行分析。为了表述和调用的方便,下面的演示代码多打包为函数。 本篇笔记使用的数据可以在《Python数据分析基础》GitHub获得。主要用到的csv文件名为:supplier_data.csv

    在Excel 2016中打开和Notepad++中打开效果分别为:

    supplier_data_pic.png
    #普通方式读取supplier_data.csv 并写入一个叫 s_csv_data.csv的文件
    def generalWayRcsv(in_fname,out_fname):
        #传入的参数分别为输入的文件路径,输出文件路径
        with open(in_fname,'r',encoding='UTF-8') as freader:  #读入
            with open(out_fname,'w') as fwriter:
                header = freader.readline() #读取首行
                header = header.strip() 
                header_list = header.split(',') 
                print(header_list) 
                fwriter.write(','.join(map(str,header_list))+'\n') 
                for row in freader: 
                    row = row.strip() 
                    row_list = row.split(',') 
                    print(row_list) 
                    fwriter.write(','.join(map(str,row_list))+'\n')
        print('end')
    in_f="supplier_data.csv"
    out_f="s_csv_data.csv"
    generalWayRcsv(in_f,out_f) #如果报错注意路径或文件编码问题
    

    out:

    ['Supplier Name', 'Invoice Number', 'Part Number', 'Cost', 'Purchase Date']
    ['Supplier X', '001-1001', '2341', '$500.00', '1/20/14']
    ['Supplier X', '001-1001', '2341', '$500.00', '1/20/14']
    ['Supplier X', '001-1001', '5467', '$750.00', '1/20/14']
    ['Supplier X', '001-1001', '5467', '$750.00', '1/20/14']
    ['Supplier Y', '50-9501', '7009', '$250.00', '1/30/14']
    ['Supplier Y', '50-9501', '7009', '$250.00', '1/30/14']
    ['Supplier Y', '50-9505', '6650', '$125.00', '2/3/14']
    ['Supplier Y', '50-9505', '6650', '$125.00', '2/3/14']
    ['Supplier Z', '920-4803', '3321', '$615.00', '2/3/14']
    ['Supplier Z', '920-4804', '3321', '$615.00', '2/10/14']
    ['Supplier Z', '920-4805', '3321', '$615.00', '2/17/14']
    ['Supplier Z', '920-4806', '3321', '$615.00', '2/24/14']
    end
    

    从以上代码可以看出读取csv的流程为:打开文件-->按行读入数据并按逗号切分字符串为列表(-->写入数据)

    用csv库读写

    csv是一个内置的Python库,通过 import csv引用。它可以很好地处理csv文件。

    import csv
    def csvLibRWdata(in_fname,out_fname):
        with open(in_fname, 'r', newline='') as csv_in_file: 
            with open(out_fname, 'w', newline='') as csv_out_file: 
                filereader = csv.reader(csv_in_file, delimiter=',') 
                filewriter = csv.writer(csv_out_file, delimiter=',') 
                for row_list in filereader:
                    print(row_list)
                    filewriter.writerow(row_list)
                    
    in_f="supplier_data.csv"
    out_f="s_csv_data.csv"
    csvLibRWdata(in_f,out_f)
    

    out:

    ['Supplier Name', 'Invoice Number', 'Part Number', 'Cost', 'Purchase Date']
    ['Supplier X', '001-1001', '2341', '$500.00', '1/20/14']
    ['Supplier X', '001-1001', '2341', '$500.00', '1/20/14']
    ['Supplier X', '001-1001', '5467', '$750.00', '1/20/14']
    ['Supplier X', '001-1001', '5467', '$750.00', '1/20/14']
    ['Supplier Y', '50-9501', '7009', '$250.00', '1/30/14']
    ['Supplier Y', '50-9501', '7009', '$250.00', '1/30/14']
    ['Supplier Y', '50-9505', '6650', '$125.00', '2/3/14']
    ['Supplier Y', '50-9505', '6650', '$125.00', '2/3/14']
    ['Supplier Z', '920-4803', '3321', '$615.00', '2/3/14']
    ['Supplier Z', '920-4804', '3321', '$615.00', '2/10/14']
    ['Supplier Z', '920-4805', '3321', '$615.00', '2/17/14']
    ['Supplier Z', '920-4806', '3321', '$615.00', '2/24/14']
    

    从以上代码可以看出,csv库可以简化很多语句,简化整体代码,通过csv.reader进行读取,并且可以指定分隔符的样式,就算是用空格隔开的文本文件(有些csv或txt文件用这种方式保存数据)可以通过改变csv.reader的参数来读文件,方便了很多。

    pandas库读写

    pandas是数据分析经常接触到的库,pandas和numpy、matplotlib是Python数据分析工具的三驾马车。功能很强大,Anaconda集成环境是包含了这三个库的,如果需要自己安装可以参考安装并使用python pandas 百度经验 等教程。Python3环境下有pip可以一条命令行安装需要的第三方库的,本处不展开。

    import pandas as pd
    def pandasLibRWdata(in_fname,out_fname):
        data=pd.read_csv(in_fname)
        data_column_by_name = data.loc[:, ['Invoice Number', 'Purchase Date']] 
        print(data)
        data_column_by_name.to_csv(out_fname, index=False)
        
    in_f="supplier_data.csv"
    out_f="s_csv_data.csv"
    pandasLibRWdata(in_f,out_f)
    

    out

       Supplier Name Invoice Number  Part Number     Cost Purchase Date
    0     Supplier X       001-1001         2341  $500.00       1/20/14
    1     Supplier X       001-1001         2341  $500.00       1/20/14
    2     Supplier X       001-1001         5467  $750.00       1/20/14
    3     Supplier X       001-1001         5467  $750.00       1/20/14
    4     Supplier Y        50-9501         7009  $250.00       1/30/14
    5     Supplier Y        50-9501         7009  $250.00       1/30/14
    6     Supplier Y        50-9505         6650  $125.00        2/3/14
    7     Supplier Y        50-9505         6650  $125.00        2/3/14
    8     Supplier Z       920-4803         3321  $615.00        2/3/14
    9     Supplier Z       920-4804         3321  $615.00       2/10/14
    10    Supplier Z       920-4805         3321  $615.00       2/17/14
    11    Supplier Z       920-4806         3321  $615.00       2/24/14
    

    从上面的代码来看,pandas作业一个数据分析库,实现csv饿读写也是很简洁的,data是一个dataframe(可以翻译作数据框)数据结构。pandas库通过read_csv(in_fname)进行csv文件读取,to_csv()可以将一个dataframe数据写入到csv,很方便。
    可以看到csv库读取出来的数据都是字符串格式,而pandas库读出来的数据会自动进行数据类型的判断,这样数字可以直接处理,因此下面读入后的数据处理还是以pandas作为例子,学习数据分析用好pandas很重要。

    读入后的数据处理

    得到的数据一般保存到列表(上一篇笔记有较详细的讲解)或者dataframe里,就可以用if进行相关筛选或者进行平均数、众数、方差等的计算了,当然对于文本数据不能计算这些,需要根据csv中具体的数据类型编写合适的代码。

    #将上面的代码扩展为读取和处理
    import pandas as pd
    def pandasLibPredata(in_fname):
        data=pd.read_csv(in_fname) #读入数据
        p_sum=sum(data['Part Number'])
        p_mean=data['Part Number'].mean()
        print(p_sum)
        print(p_mean)
        
    in_f="supplier_data.csv"
    pandasLibPredata(in_f)
    
    #输出:
    56218
    4684.833333333333
    

    下一篇笔记会讲解Excel文件的读写和读入数据后的处理,仍然用到 pandas 库,并且还会用到 xlrd 和 xlwt 两个库。本笔记的GitHub同步项目在readingForDS。要熟练文件读写需要多练习,有任何建议欢迎联系本人。

    相关文章

      网友评论

        本文标题:Python数据分析基础ReadingDay3_csv读写

        本文链接:https://www.haomeiwen.com/subject/gjgkqftx.html