[问题背景]
处理以下文本文件:
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]]