[Python数据处理] 怎样用Python预处理csv文档提取数据

[问题背景]

处理以下文本文件:

grade_gbk.csv  (GBK编码格式)

grade_uft-8.csv (UTF-8编码格式)

每个文件内容相同,共三条数据,每条数据的第一项是姓名,第二项是语文,第三项是数学,第四项是英语

首先打开Excel,输入以下内容:

姓名 语文 数学 英语
张三 128 136 112
李四 99 106 73
王五 102 148 88

然后另存为两次,第一次的文件名为'grade_gbk.csv',保存类型为'CSV (逗号分隔)(*.csv)';第二次的文件名为'grade_utf-8.csv',保存类型为'CSV UTF-8 (逗号分隔)(*.csv)',这样就得到了两种不同编码格式的.csv文件,实际应用中两种编码都可能遇到,所以下面的演示对两种编码的.csv文件的读取都作一个简单的介绍。

[问题分析]

在.csv文件所在目录下新建.py文件,注意.py文件名可以自取,但不能是csv.py,否则代码中调用csv时会调到自身报错AttributeError: module 'csv' has no attribute 'excel'。(关于这个错误的解决,参考了学习Python csv模块遇到AttributeError: module 'csv' has no attribute 'writer'和写入后出现空格问题 - ceoicac的博客 )

首先来看如何读取GBK编码的.csv文件。这里可以用pandas库。

(pandas库安装命令 cmd下输入 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple即可安装pandas库)

导入pandas库:

import pandas as pd

编写loadData()函数:(数据预处理函数)(filePath为文件路径名)

def loadData(filePath):

调用pandas库的read_csv()函数,参数为文件路径名filePath,编码格式名encoding = 'gbk',读取的文件信息返回给csv变量:

    csv = pd.read_csv(filePath, encoding='gbk')

输出csv文件内容到屏幕:

    print(csv)

编写主函数:

if __name__ == '__main__':
    loadData('grade_gbk.csv')

完整代码为:

def loadData(filePath):
    csv = pd.read_csv(filePath, encoding='gbk')
    print(csv)
if __name__ == '__main__':
    loadData('grade_gbk.csv')

完成后运行程序,Python Shell将会显示:

   姓名   语文   数学   英语
0  张三  128  136  112
1  李四   99  106   73
2  王五  102  148   88

这样我们就能够使用Python显示.csv文件内容了。

不过,在[Python数据处理] 怎样用Python预处理txt文档提取数据演示了返回retName和retData的过程,这里也介绍一下loadData()函数的改写:

实际上使用csv.values就可以获取列表化的csv:

[['张三' 128 136 112]
 ['李四' 99 106 73]
 ['王五' 102 148 88]]

在旧版本中曾经用as_matrix()方法起到同样的功能,但运行提示会告诉我们as_matrix()方法在未来的版本中将要被移除,推荐我们用成员变量values代替。亦即csv.values代替了csv.as_matrix()

对于csv.values这样一个列表,提取姓名和分数自然是很容易的:

遍历csv.values的每一行:

    for line in csv.values:

提取每行第一列为姓名:

        retName.append(line[0])

提取每行第二列及以后为分数:(注意line[1:]是numpy.array格式,还需要用tolist()转换成Python的list列表)

        retData.append(line[1:].tolist())

最后返回retName和retData:

    return retName, retData

编写主函数:

if __name__ == '__main__':
    Names, Grades = loadData('grade_gbk.csv')
    print(Names, Grades)

因此,处理学生成绩单的GBK编码格式.csv文件的完整代码为:

import pandas as pd

def loadData(filePath):
    csv = pd.read_csv(filePath, encoding='gbk')
    retName = []
    retData = []
    for line in csv.values:
        retName.append(line[0])
        retData.append(line[1:].tolist())
    return retName, retData

if __name__ == '__main__':
    Names, Grades = loadData('grade_gbk.csv')
    print(Names, Grades)

而处理UTF-8编码也很简单:

import pandas as pd

def loadData(filePath):
    csv = pd.read_csv(filePath, encoding='utf-8')
    retName = []
    retData = []
    for line in csv.values:
        retName.append(line[0])
        retData.append(line[1:].tolist())
    return retName, retData

if __name__ == '__main__':
    Names, Grades = loadData('grade_utf-8.csv')
    print(Names, Grades)

即可得到姓名和分数:

['张三', '李四', '王五'] [[128, 136, 112], [99, 106, 73], [102, 148, 88]]

 

你可能感兴趣的:(Python,Python,数据挖掘,入门)