- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
8.3 文件的应用.ipynb @master — view markup · raw · history · blame
文件的应用¶
csv文件¶
CSV是文本文档,所以对文本进行读写的方法都适用于CSV格式文件的数据处理。而CSV格式的文件里的数据基本上都是由行和列构成的二维数据,可以使用列表嵌套的方法对其进行处理。
实例 9.5 读文件处理文件中的数据¶
文件5.7 score.csv 中数据如下,读取其中的数据并进行处理。
# 读文件中的数据为二维列表
score_ls = [] # 创建空列表
with open('images/ch8/5.7 score.csv','r',encoding='utf-8') as fr:
for line in fr: # 遍历文件对象
score_ls.append(line.strip().split(',')) # 文件每行切分为一个列表,split()参数根据文件中的分隔符确定
print(score_ls)
定义为函数,用列表推导式实现更简洁,类似问题只修改文件名和切分时使用的分隔符即可重用此代码。
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(score_lst)
为每位同学增加总成绩,可以将列表序号为0的元素score[0]拼接上['总分'],对剩余部分列表 score[1:] 进行遍历,每次得到一位同学的列表 x ,切片 x[1:] 为各门课的成绩,用map()函数将每个元素都 映射为整数,再用 sum() 函数对其进行求和并附加到列表中。
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
def add_total(score_ls):
"""接收二维列表,增加总分,返回新的二维列表"""
title = score_ls[0] + ['总分'] # 列表拼接,一维列表
score_total = [title] # 创建新列表,首元素为原列表标题行增加平均成绩
for x in score_ls[1:]: # 略过标题行进行遍历
total = sum(map(int, x[1:])) # 切取成绩部分映射为整数,计算总成绩
score_total.append(x + [str(total)]) # 每个列表拼接字符型平均成绩
return score_total
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(add_total(score_lst))
将增加了总成绩的列表数据写入到文件中
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
def add_total(score_ls):
"""接收二维列表,增加总分,返回新的二维列表"""
title = score_ls[0] + ['总分'] # 列表拼接,一维列表
score_total = [title] # 创建新列表,首元素为原列表标题行增加平均成绩
for x in score_ls[1:]: # 略过标题行进行遍历
total = sum(map(int, x[1:])) # 切取成绩部分映射为整数,计算总成绩
score_total.append(x + [str(total)]) # 每个列表拼接字符型平均成绩
return score_total
def write_file(score_total, filename):
"""接收成绩二维列表和写入文件名的字符串,
将二维列表中的数据分行写入文件,每个列表中的数据写为一行,用逗号分隔
无返回值"""
with open(filename, 'w', encoding='utf-8') as fw: # 写模式打开文件
for line in score_total: # 遍历二维列表
fw.write(','.join(line) + '\n') # 子列表元素用逗号拼接为字符串加换行符
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
score_total_ls = add_total(score_lst)
write_file(score_total_ls, 'score_total.csv')
print(read_file('score_total.csv'))
练一练
修改实例9.4的程序,增加一个函数,可以获得文件中所有同学的名字,参考这个代码,获取并输出python课程的成绩的列表。
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
def get_name(score_ls):
"""接收二维列表,返回全部学生名字的列表"""
return [x[0] for x in score_ls[1:]]
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(get_name(score_lst))
练一练
# 获取并输出python课程的成绩的列表
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
def get_python(score_ls):
"""接收二维列表,返回全部学生python成绩的列表。
列表中成绩应为整数
"""
# 补充你的代码
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(get_python(score_lst))
# 获取并输出python课程的成绩的列表
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回二维列表"""
with open(filename, 'r', encoding='utf-8') as fr:
score_ls = [x.strip().split(',') for x in fr]
return score_ls
def get_python_avg(score_ls):
"""接收二维列表,返回全部学生python的平均成绩"""
# 补充你的代码
python = [int(x[3]) for x in score_ls[1:]]
return sum(python) / len(python)
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(get_python_avg(score_lst))
练一练
转为
def read_file(filename):
"""接收文件名为参数,读取文件中的数据为二维列表,返回行列转置后的二维列表"""
# 补充你的代码
if __name__ == '__main__':
score_lst = read_file('images/ch8/5.7 score.csv')
print(score_lst)
练一练
附件文件成绩分析综合.csv 中记录了学生实验课的成绩,其中8次实验占总成绩的70%,作业成绩占总成绩的30%,请完成以下任务:
- 计算每位同学的总成绩
- 在平时成绩后增加总成绩,按总成绩降序排序,总成绩相同时按学号降序排序,写到文件“成绩分析汇总.csv”中
# 此代码为读csv文件到列表中,参考此代码完成题目
def read_txt(filename):
"""读文件到二维列表"""
with open(filename, encoding='utf-8') as f:
return [x.strip().split(',') for x in f]
if __name__ == '__main__':
score = read_txt('images/ch8/成绩分析综合.csv')
print(score)
def read_csv(filename):
"""读文件到二维列表,精简代码"""
# 补充你的代码
def add_total(score_ls):
"""接收包含成绩的二维列表,标题行增加“总成绩”列,计算总成绩并附加到列表中,
返回增加了总成绩的二维列表。
"""
# 补充你的代码
def write_file(total_score, filename):
"""接收成绩二维列表和写入文件名的字符串,将二维列表中的数据分行写入文件,
每个列表中的数据写为一行,用逗号分隔,无返回值。
"""
# 补充你的代码
if __name__ == '__main__':
score_lst = read_csv('images/ch8/成绩分析综合.csv') # 读文件到列表
score_all = add_total(score_lst)
write_file(score_all, '成绩分析综合2.csv') # 写入到'成绩分析综合2.csv'
print(read_csv('成绩分析综合2.csv')) # 再次调用读文件的函数,参数为新写入的文件名,查看是否写入成功
JSON文件¶
JSON的编码过程是将一个Python对象转为JSON格式数据,
主要使用json.dumps(obj)和json.dump(obj,fp)两个方法。
| 方法 | 描述 |
|---|---|
| json.dumps(obj) | 将Python 数据类型obj对象编码成JSON数据,写入内存。 |
| json.dump(obj,fp) | 将Python 数据类型obj对象编码成JSON数据,写入磁盘文件对象fp中。 |
json 中默认ensure_ascii=True, 会将中文等非ASCII 字符转为unicode 编码(形如\uXXXX),设置ensure_ascii=False 可以禁止JSON 将中文转为unicode 编码,保持中文原样输出。
Python中的字典数据转为JSON 默认不排序。可设置sort_keys=True使转换结果按照字典升序排序(a-z)。
indent 参数可用来对JSON 数据进行格式化输出,默认值为None,不做格式化处理,可设一个大于0 的整数表示缩进量,例如indent=4。输出的数据被格式化之后,变得可读性更好。
JSON的解码过程是将JSON格式数据转为Python对象,Python 的原始类型与JSON类型会相互转换。
主要使用json.loads(s)和json.load(fp)两个方法。
| 方法 | 描述 |
|---|---|
| json.loads(s) | 将字符串s中的JSON数据解码为Python 数据类型,其他格式数据会转为unicode格式。 |
| json.load(fp) | 将磁盘文件对象fp中的JSON数据解码为Python 数据类型,其他格式数据会转为unicode格式。 |
将csv文件"成绩分析综合.csv"转为json文件
import json
def read_csv(filename):
"""读文件到二维列表,返回二维列表"""
with open(filename, "r", encoding='utf-8') as f:
return [x.strip().split(',') for x in f]
def to_json(score_ls):
"""将二维列表标题行的元素与子列表中的元素一一组合,
禁止JSON 将中文转为unicode 编码,保持中文原样输出。
对JSON 数据进行格式化输出,缩进4个字符,
返回json格式数据"""
score_dic = []
for i in range(1, len(score_ls)):
score_dic.append(dict(zip(score_ls[0], score_ls[i])))
return json.dumps(score_dic, ensure_ascii=False, indent=4)
def write_to_json(score_ls):
"""将二维列表标题行的元素与子列表中的元素一一组合,
禁止JSON 将中文转为unicode 编码,保持中文原样输出。
对JSON 数据进行格式化输出,缩进4个字符,
写入json格式文件"""
score_dic = []
for i in range(1, len(score_ls)):
score_dic.append(dict(zip(score_ls[0], score_ls[i])))
with open('成绩分析综合.json','w',encoding='utf-8') as score_json:
json.dump(score_dic,score_json, ensure_ascii=False, indent=4)
def read_json_to_ls(filename):
"""读json文件,返回元素为字典类型的列表"""
with open(filename, "r", encoding='utf8') as f:
score_dic_ls = json.load(f)
return score_dic_ls
if __name__ == '__main__':
score_lst = read_csv('images/ch8/成绩分析综合.csv')
# print(to_json(score_lst))
write_to_json(score_lst)
print(read_json_to_ls('成绩分析综合.json'))
def read_json(filename):
"""读json文件,以字符串形式输出,查看写入文件的格式"""
with open(filename, "r", encoding='utf8') as f:
print(f.read())
if __name__ == '__main__':
read_json('成绩分析综合.json')
借用eval()实现json转csv¶
eval()可以将字符串转为python数据类型,所以可以先用read()将json文件内容读取为字符串,再用eval()转为列表,再转csv文件
with open('成绩分析综合.json',encoding='utf-8') as fr:
txt = fr.read() # txt为字符串
txt_py = eval(txt) # txt_py为元素为字典的列表
title = list(txt_py[0].keys()) # title为标题列表
score = [list(i.values()) for i in txt_py] # score为值的列表
score_ls = [title]+score # score_ls为标题+值的列表
with open('成绩分析综合.csv','w',encoding='utf-8') as fw:
for lst in score_ls: # 遍历列表
fw.write(','.join(lst)+'\n') # 将列表用逗号拼接为字符串并写入文件
os库常用方法¶
| 方法 | 描述 |
|---|---|
| os.getcwd() | 获取当前工作路径 |
| os.chdir(path) | 将当前工作路径修改为path,如os.chdir(r'c:\Users') |
| os.path.exist(name) | 判断name文件夹或文件是否存在,存在返回True,否则返回False |
| os.mkdir(pathname) | 新建一个名为pathname的文件夹 |
| os.rmdir(pathname) | 删除空文件夹pathname,文件夹不为空则报OSError错误 |
| os.path.isdir(path) | 判断path是否是文件夹,是则返回True,否则返回False |
| os.path.getsize(file) | 文件file存在,返回其大小(byte为单位),不存在则报错 |
| os.remove(filename) | 删除文件 filename,文件不存在则报错 |
| os.path.isfile(filename) | 返回filename是否是文件,是返回True,否则返回False |
| os.listdir(path) | 以列表形式返回path路径下的所有文件名,不包括子路径中的文件名 |
| os.walk(path) | 返回类型为生成器,包含数据为若干包含文件和文件夹名的元组数据 |
# getcwd() 获取当前工作目录
import os
result = os.getcwd()
print(result)
import os
result = os.listdir('/home/jovyan/work')
print(result)
import numpy as np
data = np.genfromtxt('images/ch8/成绩分析综合.csv',delimiter=',',encoding='utf-8',dtype=str)
# 数据的标题行中有#,其后面的内容默认会被当成注释而忽略掉,导致标题行与数据行的列数不同而出错,可以用comments标明注释符
print(data)
import numpy as np
data = np.genfromtxt('images/ch8/5.7 score.csv',delimiter=',',encoding='utf-8',dtype=str,comments=None)
# 数据的标题行中有#,其后面的内容默认会被当成注释而忽略掉,导致标题行与数据行的列数不同而出错,可以用comments标明注释符
print(data)