• 又见Python<5>:结构化数据的读取


    本文主要对Python如何读取结构化数据进行总结梳理,涵盖从文本文件,尤其是excel文件(用于离线数据探索分析),以及结构化数据库(以Mysql为例)中读取数据等内容。

    约定:

    import numpy as np
    import pandas as pd
    

    1、从文本文件中读取

    (1)使用Python标准库中的read、readline、readlines方法读取

    a. 一般流程:
    step1: 通过open方法创建一个文件对象
    setp2: 通过read、readline、readlines方法读取文件内容
    step3: 通过close方法关闭文件对象
    b. 区别:
    示例:test.txt

    read方法:读取全部数据,结果为一个字符串(所有行合并为一个字符串)

    #打开文件
    f = open('/labcenter/python/pandas/test.txt')
    #使用read方法读取文件
    data1 = f.read()
    print data1
    type(data1)
    #关闭文件
    f.close()
    

    结果:

    col1    col2    col3
    101 20  0.68
    102 30  0.79
    103 50  0.72
    104 60  0.64
    105 70  0.55
    str
    

    readline方法:读取一行数据,结果为一个字符串,需要seek ext等指针操作方法配合实现所有记录的遍历。

    #打开文件
    f = open('/labcenter/python/pandas/test.txt')
    #使用readline方法读取文件
    data2 = f.readline()
    print data2
    type(data2)
    #关闭文件
    f.close()
    

    结果:

    col1    col2    col3
    str
    

    readlines方法:读取全部数据,结构为一个列表(一行为列表中的一个元素)

    #打开文件
    f = open('/labcenter/python/pandas/test.txt')
    #使用readlines方法读取文件
    data3 = f.readlines()
    print data3
    type(data3)
    for line in data3:
        print line
    #关闭文件
    f.close()
    

    结果:

    ['col1    col2    col3
    ', '101 20  0.68
    ', '102 30  0.79
    ', '103 50  0.72
    ', '104 60  0.64
    ', '105 70  0.55']
    list
    col1    col2    col3
    101 20  0.68
    102 30  0.79
    103 50  0.72
    104 60  0.64
    105 70  0.55
    

    c. 支持文件范围:
    txtcsv sv及所有以固定分隔符分隔的文本文件。

    (2)使用Numpy库中的loadtxt、load、fromfile方法读取

    a. loadtxt方法
    从txt文本文件中读取,返回一个数组。
    np.loadtxt('/labcenter/python/pandas/test.txt',skiprows=1)
    Out[413]:
    array([[ 101. , 20. , 0.68],
    [ 102. , 30. , 0.79],
    [ 103. , 50. , 0.72],
    [ 104. , 60. , 0.64],
    [ 105. , 70. , 0.55]])
    b. load方法
    读取Numpy专用的二进制数据文件,该文件通常基于Numpy的save或savez方法生成。

    write = np.array([[1,2,3,4],[5,6,7,8]])
    np.save('output',write)
    data = np.load('output.npy')
    print data
    type(data)
    

    结果:

    [[1 2 3 4]
    [5 6 7 8]]
    numpy.ndarray
    

    c. fromfile方法
    读取简单的文本文件和二进制文件,该文件通常基于Numpy的tofile方法生成。

    write = np.array([[1,2,3,4],[5,6,7,8]])
    write.tofile('output')
    data = np.fromfile('output',dtype='float32')
    print data
    type(data)
    

    结果:

    [  1.40129846e-45   0.00000000e+00   2.80259693e-45 ...,   0.00000000e+00
       1.12103877e-44   0.00000000e+00]
    numpy.ndarray
    

    (3)使用Pandas库中的read_csv、read_table、read_excel等方法读取

    a. read_csv方法
    读取csv文件,返回一个DataFrame对象或TextParser对象。
    示例:
    test.csv

    data = pd.read_csv('/labcenter/python/pandas/test.csv')
    print data
    type(data)
    

    结果:

       col1  col2  col3
    0   101    20  0.68
    1   102    30  0.79
    2   103    50  0.72
    3   104    60  0.64
    4   105    70  0.55
    pandas.core.frame.DataFrame
    

    b. read_table方法
    读取通用分隔符分隔的文本文件,返回一个DataFrame对象或TextParser对象。

    data = pd.read_table('/labcenter/python/pandas/test.csv',sep=',')
    print data
    type(data)
    

    结果:

       col1  col2  col3
    0   101    20  0.68
    1   102    30  0.79
    2   103    50  0.72
    3   104    60  0.64
    4   105    70  0.55
    pandas.core.frame.DataFrame
    

    c. read_excel方法
    读取excel文件,返回一个DataFrame对象或TextParser对象。
    示例:
    test.xlsx

    data = pd.read_excel('/labcenter/python/pandas/test.xlsx')
    print data
    type(data)
    

    结果:

       col1  col2  col3
    0   101    21  22.6
    1   102    31  31.2
    2   103    41  32.7
    3   104    51  28.2
    4   105    61  18.9
    pandas.core.frame.DataFrame
    

    d. 其他方法
    read_sql方法:读取sql请求或者数据库中的表。
    read_json方法:读取json文件。

    (4)如何选择?

    a. 选取自己最熟悉的方法。
    b. 根据场景选择:
    ① 对纯文本、非结构化的数据:标准库的三种方法
    ② 对结构化、数值型,并且要用于矩阵计算、数据建模的:Numpy的loadtxt方法
    ③ 对于二进制数据:Numpy的load和fromfile方法
    ④ 对于结构化的数据,并且要用于数据探索分析的:Pandas方法

    2、从Excel文件中读取

    excel往往是在进行离线数据探索分析时提供的数据文件格式,因此这里单独拿出来多总结一下。

    (1)使用Pandas库的read_excel方法

    见上文1.3.c内容。

    (2)使用其他第三方库

    以xlrd库为例, xlrd模块实现对excel文件内容读取。

    import xlrd
    #打开一个excel文件
    xlsx=xlrd.open_workbook('/labcenter/python/pandas/test.xlsx')
    #读取sheet清单
    sheets=xlsx.sheet_names()
    sheets
    #获取一个sheet数据
    sheet1=xlsx.sheets()[0]
    #获取指定sheet的名称
    sheet1.name
    #获取指定sheet的行数
    sheet1.nrows
    #获取指定sheet的列数
    sheet1.ncols
    #获取指定sheet某行的数据
    sheet1.row_values(1)
    #获取指定sheet某列的数据
    sheet1.col_values(1)
    #获取指定sheet某单元格的数据
    sheet1.row(1)[2].value
    sheet1.cell_value(1,2)
    #逐行获取指定sheet的数据
    for i in range(sheet1.nrows):
        print sheet1.row_values(i)
    

    结果:

    [u'Sheet1', u'Sheet2']
    u'Sheet1'
    6
    3
    [101.0, 21.0, 22.6]
    [u'col2', 21.0, 31.0, 41.0, 51.0, 61.0]
    22.6
    22.6
    [u'col1', u'col2', u'col3']
    [101.0, 21.0, 22.6]
    [102.0, 31.0, 31.2]
    [103.0, 41.0, 32.7]
    [104.0, 51.0, 28.2]
    [105.0, 61.0, 18.9]
    

    ##3、从结构化数据库中读取 根据数据库选择相应的库,如:mysql数据库使用MySQLdb库,oracle数据库使用cx_Oracle库,teradata数据库使用teradata库,等等。 一般流程: step1: 建立数据库连接 step2: cursor方法获取游标 step3: execute方法执行SQL语句 step4: fetchall方法获取返回的记录 step5: close方法关闭游标 step6: close方法断开数据库连接 示例:
    import MySQLdb
    #建立数据库连接
    conn = MySQLdb.connect("localhost", "root", "root", "testdb", charset='utf8')
    #获取游标
    cursor = conn.cursor()
    #执行SQL语句
    cursor.execute("select * from mytab1;")
    #获取返回的记录
    results = cursor.fetchall()
    #逐行打印
    for result in results:
        print result
    #关闭游标
    cursor.close()
    #断开数据库连接
    conn.close()
    

    结果:

    (1L, u'aaa')
    (2L, u'bbb')
    (3L, u'ccc')
    (4L, u'ddd')
    (5L, u'eee')
    

    可通过命令pip install MySql-Python安装库MySQLdb。

    4.参考与感谢

    [1] Python数据分析与数据化运营




  • 相关阅读:
    操作系统与进程.md
    解决粘包现象
    Python3网络爬虫开发实战
    Django学习目录
    前端学习目录
    MySQL数据库学习目录
    第一章 开发环境配置
    15.3 Scrapyd 对接 Docker
    13.4 Spider 的用法
    9.1 代理的设置
  • 原文地址:https://www.cnblogs.com/hbsygfz/p/8883410.html
Copyright © 2020-2023  润新知