5.1 Python自带的CSV模块
csv.reader(csvfile, dialect='excel, **fmtparams'):用于读取文件返回一个reader对象用于CSV文件内容上进行迭代。参数说明:
- csvfile:文件对象或list对象
- dialect:指定CSV文件格式
- fmtparams:一系列参数列表,用于设置特定的格式,以覆盖dialect中的格式
import csv
# 以只读模式打开test.csv文件,并用csv.reader()方式读取
csvFile = open('test.csv', 'r', encoding='utf-8-sig')
data = csv.reader(csvFile)
# 打印data发现是地址
print(data) # 结果为:<_csv.reader object at 0x0000021BF610BE80>
# 需要用循环语句进行输出,并且是以一行一行列表形式输出
for i in data:
print(i)
'''
['姓名', '年龄', '学号', '英语', '数学', 'Python', '面向对象']
['aaa', '18', '101', '90', '80', '90', '85']
['bbb', '18', '102', '62', '90', '85', '88']
['ccc', '19', '103', '85', '87', '75', '98']
['ddd', '18', '104', '75', '65', '65', '69']
['eee', '18', '105', '86', '63', '88', '78']
['fff', '19', '106', '74', '84', '96', '86']
['ggg', '19', '107', '60', '60', '67', '66']
['hhh', '18', '108', '76', '95', '78', '70']
'''
# 创建CSV文件并写入
csvFile1 = open('1.csv', 'w', encoding='utf-8-sig')
# 使用csv.write()来写入
write = csv.writer(csvFile1)
# 单行写入
write.writerow([1, 1, 'hhh', 'lll'])
# 定义多行
rows = [[2, 2, 'hhh', 'lll'], [3, 3, 'hhh', 'lll']]
write.writerows(rows)
# 读取并显示内容
csvFile1 = open('1.csv', 'r', encoding='utf-8-sig')
data1 = csv.reader(csvFile1) # 地址:<_csv.reader object at 0x0000023802B4C520>
print(data1)
for j in data1:
print(j)
'''
['1', '1', 'hhh', 'lll']
[]
['2', '2', 'hhh', 'lll']
[]
['3', '3', 'hhh', 'lll']
[]
'''
如果想在原来文件的基础上追加则可以这样写
csvFile = open('1.csv', 'add')
但是Python自带的CSV模块是远远不够处理CSV文件的。
5.2 使用Pandas库处理CSV文件
在前面一个笔记里有讲过通过读取CSV文件创建DataFrame对象,但是就举了一点例子,在这一小节多举一些例子,熟悉读取/写入数据。
5.2.1 read_csv()方法例子
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf-8')
# head()方法默认打印前5行,设置参数3则是打印前三行
print(df.head(3))
'''
姓名 年龄 学号 英语 数学 Python 面向对象
0 aaa 18 101 90 80 90 85
1 bbb 18 102 62 90 85 88
2 ccc 19 103 85 87 75 98
'''
5.2.2 查看列数、维度和切片操作
打印列的表头
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf-8')
print(df.columns)
# 结果为:Index(['姓名', '年龄', '学号', '英语', '数学', 'Python', '面向对象'], dtype='object')
显示维度(几行几列),利用shape属性,与NumPy库中的shape作用一样
# 接上面的代码
print(df.shape) # 结果为:(8, 7),8行7列
利用loc[]指定index的具体值(loc[2:4]表示取index=2到index=4范围的值,参数可以是字符串等),iloc[]:从0行算,到第几行,不看index的具体值(iloc[2:4]表示取第2行到第3行的值,且参数只能是整数)
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf-8')
print(df)
'''
姓名 年龄 学号 英语 数学 Python 面向对象
0 aaa 18 101 90 80 90 85
1 bbb 18 102 62 90 85 88
2 ccc 19 103 85 87 75 98
3 ddd 18 104 75 65 65 69
4 eee 18 105 86 63 88 78
5 fff 19 106 74 84 96 86
6 ggg 19 107 60 60 67 66
7 hhh 18 108 76 95 78 70
'''
print(df.loc[2:4])
'''
姓名 年龄 学号 英语 数学 Python 面向对象
2 ccc 19 103 85 87 75 98
3 ddd 18 104 75 65 65 69
4 eee 18 105 86 63 88 78
'''
print(df.iloc[2:4])
'''
姓名 年龄 学号 英语 数学 Python 面向对象
2 ccc 19 103 85 87 75 98
3 ddd 18 104 75 65 65 69
'''
5.2.3 读取特定的列以及列的改值操作
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf-8')
print(df[['姓名', '学号']])
'''
姓名 学号
0 aaa 101
1 bbb 102
2 ccc 103
3 ddd 104
4 eee 105
5 fff 106
6 ggg 107
7 hhh 108
'''
c = df[['英语']]/10
print(df[['英语']])
'''
英语
0 90
1 62
2 85
3 75
4 86
5 74
6 60
7 76
'''
df[['英语']] = c
print(df[['英语']])
'''
英语
0 9.0
1 6.2
2 8.5
3 7.5
4 8.6
5 7.4
6 6.0
7 7.6
'''
5.2.4 求某一列的最大值、最小值、算数平均数以及数据的排序
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf-8')
print(df['Python'].max()) # 结果为:96
print(df['Python'].min()) # 结果为:65
print(df['Python'].mean()) # 结果为:80.5
# ascend参数控制升序(True)还是降序(False),inplace为True时会覆盖数据,False则是单纯打印数据
# 升序
print(df.sort_values('Python', inplace=False, ascending=True))
'''
姓名 年龄 学号 英语 数学 Python 面向对象
3 ddd 18 104 7.5 65 65 69
6 ggg 19 107 6.0 60 67 66
2 ccc 19 103 8.5 87 75 98
7 hhh 18 108 7.6 95 78 70
1 bbb 18 102 6.2 90 85 88
4 eee 18 105 8.6 63 88 78
0 aaa 18 101 9.0 80 90 85
5 fff 19 106 7.4 84 96 86
'''
# 降序
print(df.sort_values('Python', inplace=False, ascending=False))
'''
姓名 年龄 学号 英语 数学 Python 面向对象
5 fff 19 106 7.4 84 96 86
0 aaa 18 101 9.0 80 90 85
4 eee 18 105 8.6 63 88 78
1 bbb 18 102 6.2 90 85 88
7 hhh 18 108 7.6 95 78 70
2 ccc 19 103 8.5 87 75 98
6 ggg 19 107 6.0 60 67 66
3 ddd 18 104 7.5 65 65 69
'''
5.2.5 写入操作——to_csv()方法
import pandas as pd
file = pd.read_csv('test.csv')
file = file.head(5)
print(file)
'''
姓名 年龄 学号 英语 数学 Python 面向对象
0 aaa 18 101 90 80 90 85
1 bbb 18 102 62 90 85 88
2 ccc 19 103 85 87 75 98
3 ddd 18 104 75 65 65 69
4 eee 18 105 86 63 88 78
'''
file.to_csv('test1.csv') # 会生成一个text1.csv文件
5.3 处理非.csv格式的数据
5.3.1 读取TXT文件
因为.csv文件是以相同的分隔符分隔各个数据,要把txt文件转化为CSV文件需要满足8条要求:
(1)开头不留空,以行为单位;
(2)可含或不含列名,若含列名则位于文件第1行;
(3)一行数据不跨行,无空行;
(4)以半角逗号作为分隔符,即便列为空也要用空格表达其存在;
(5)列内容若存在半角引号,则将其替换成半角双引号转义;
(6)编码格式不限,可为ASCII、Unicode或其他
(7)不支持数字;
(8)不支持特殊字符
(感觉好麻烦,不如还是用excel吧[/狗头])
5.3.2 读取Excel文件
使用read_excel(io, sheet_name=0, skiprows=None等参数)方法读取文件,一些参数说明:
- sheet_name:从0开始计数,表示要打开的Excel表有多少张工作表
- skiprows:跳过特定行,skiprows = n跳过前n行;skiprows = [a, b, c],表示跳过a+1,b+1,c+1行
- nrows:读取前n行
- skipfooter:跳过表格后的n行
import pandas as pd
# 如果没有添加openpyxl
# 方法一:在cmd里输入pip install openpyxl
# 方法二:下载pandas包一样,找到openpyxl包并下载就可以了
file = pd.read_excel('pandas_test.xlsx')
print(file.head())
'''
姓名 年龄 学号 班级
0 aaa 18 101 1班
1 bbb 18 102 1班
2 ccc 19 103 2班
3 ddd 18 104 1班
4 eee 18 105 3班
'''
file1 = pd.read_excel('pandas_test.xlsx', skiprows=5)
print('跳过前5行:')
print(file1)
'''
跳过前5行:
eee 18 105 3班
0 fff 19 106 3班
1 ggg 19 107 2班
2 hhh 18 108 3班
3 aaa 18 109 1班
4 bbb 18 110 2班
5 ccc 18 111 3班
6 ddd 18 112 4班
7 eee 18 113 5班
8 fff 18 114 6班
9 ggg 18 115 7班
10 hhh 18 116 8班
11 aaa 18 117 9班
12 bbb 18 118 10班
13 ccc 18 119 11班
14 ddd 18 120 12班
'''
file2 = pd.read_excel('pandas_test.xlsx', skipfooter=5)
print('跳过后6行(5+1):')
print(file2)
'''
跳过后6行(5+1):
姓名 年龄 学号 班级
0 aaa 18 101 1班
1 bbb 18 102 1班
2 ccc 19 103 2班
3 ddd 18 104 1班
4 eee 18 105 3班
5 fff 19 106 3班
6 ggg 19 107 2班
7 hhh 18 108 3班
8 aaa 18 109 1班
9 bbb 18 110 2班
10 ccc 18 111 3班
11 ddd 18 112 4班
12 eee 18 113 5班
13 fff 18 114 6班
14 ggg 18 115 7班
'''
从这Python数据分析从小白到专家_百度百科本书上学的知识