python进阶之路9文件的处理方法
内容回顾
字典内置方法
1.类型转换 dict()
2.重要操作
get()
d[key] = values 常用
pop()
update() 键存在则修改键值对 键不存在则新增键值对
fromkeys()
ps:字典内键值对默认是无序的
元组内置方法
1.类型转换 set()
2.重要操作
去重
关系运算
ps:集合内数据值也是无序的
字符编码理论
主要针对文本文件
字符编码>>>:内部记录了人类的字符与数字的对应关系
字符编码发展史
ASCII码
A-Z 65-90
a-z 97-122
GBK、shift_JIS、Euc_Kr
unicofe、utf家族(utf8 utf16 utf32)
ps:英文字符采用一个字节 中文字符采用三个字节甚至更多
字符编码实操
1.解决文本文件乱码的核心就是当初什么编码存的就以什么编码取
2.编码与解码
编码:人类字符>>>计算机字符
encode()
解码:计算机字符>>>人类字符
decode()
ps:在python中bytes类型可以看成是二进制b'’
3.python解释器差异
文件头: # encoding:utf8
字符串:u''
内容概要
文件操作
利用python代码的编写来读写文件
1.文件的概念
2.文件的操作方式
3.文件读写模式
4.文件操作模式
5.文件诸多方法
6.文件内容修改
7.文件光标移动
作业讲解
1.优化员工管理系统
拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系)
员工的信息有:用户名 年龄 岗位 薪资...
员工管理系统:注册、查看(单个员工、所有员工)、修改薪资、删除员工
2.去重下列列表并保留数据值原来的顺序
eg: [1,2,3,2,1] 去重之后 [1,2,3]
l1 = [2,3,2,1,2,3,2,3,4,3,4,3,2,3,5,6,5]
3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
linuxs={'kermit','tony','gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
2. 求出所有报名的学生名字集合
3. 求出只报名python课程的学员名字
4. 求出没有同时这两门课程的学员名字集合
4.统计列表中每个数据值出现的次数并组织成字典战士
eg: l1 = ['jason','jason','kevin','oscar']
结果:{'jason':2,'kevin':1,'oscar':1}
真实数据
l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
# 2.定义一个存储所有员工信息的字典
# user_data_dict = {} # {'编号':用户字典, '编号':用户字典}
'''
数据存储的方式1
{
'jason':[18, 'teacher', 10],
'kevin':[28, 'sale', 90]
}
数据存储的方式2
{
'jason':{'age':18, 'job':'teacher', 'salary':8000},
'kevin':{'age':28, 'job':'sale', 'salary':9000}
}
数据存储的方式3
{
'1':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
'2':{'name':'kevin','age':28, 'job':'sale', 'salary':9000},
'3':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
}
'''
# 1.先搭建系统骨架
# while True:
# print("""
# 1.创建员工信息
# 2.查看单个员工
# 3.查看所有员工
# 4.修改员工薪资
# 5.删除员工信息
# """)
# choice = input('请选择您想要执行的功能编号>>>:').strip()
# if choice == '1':
# while True:
# # 1.获取员工编号
# emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
# if emp_id == 'q':
# break
# # 判断编号是否是纯数字
# if not emp_id.isdigit():
# print('员工编号必须是纯数字')
# continue
# # 2.判断员工编号是否已存在
# if emp_id in user_data_dict:
# print('员工编号已存在 请重新录入')
# continue
# # 3.获取员工详细信息
# username = input('请输入员工姓名>>>:').strip()
# age = input('请输入员工年龄>>>:').strip()
# job = input('请输入员工岗位>>>:').strip()
# salary = input('请输入员工薪资>>>:').strip()
# # 4.构建一个临时的小字典
# temp_dict = {}
# # 5.添加员工信息键值对
# temp_dict['emp_id'] = emp_id
# temp_dict['name'] = username
# temp_dict['age'] = age
# temp_dict['job'] = job
# temp_dict['salary'] = salary
# # 6.添加到大字典中
# user_data_dict[emp_id] = temp_dict
# print(f'员工{username}添加成功')
# elif choice == '2':
# while True:
# # 1.先获取员工编号
# target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# # 2.判断员工编号是否不存在
# if target_id not in user_data_dict:
# print('员工编号不存在 无法查看')
# continue
# # 3.根据员工编号获取员工字典数据
# user_dict = user_data_dict.get(target_id)
# # 4.格式化输出
# print(f"""
# --------------info of emp-------------------
# 编号:{user_dict.get('emp_id')}
# 姓名:{user_dict.get('name')}
# 年龄:{user_dict.get('age')}
# 岗位:{user_dict.get('job')}
# 薪资:{user_dict.get('salary')}
# --------------------------------------------
# """)
# elif choice == '3':
# for user_dict in user_data_dict.values():
# print(f"""
# --------------info of emp-------------------
# 编号:{user_dict.get('emp_id')}
# 姓名:{user_dict.get('name')}
# 年龄:{user_dict.get('age')}
# 岗位:{user_dict.get('job')}
# 薪资:{user_dict.get('salary')}
# --------------------------------------------
# """)
# elif choice == '4':
# while True:
# # 1.先获取想要修改的员工编号
# target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# if target_id not in user_data_dict:
# print('员工编号不存在')
# continue
# # 2.获取新的薪资
# new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
# if not new_salary.isdigit():
# print('薪资只能是纯数字')
# continue
# # 3.获取员工字典
# user_dict = user_data_dict.get(target_id) # {'salary':123}
# # 4.修改字典中的薪资
# user_dict['salary'] = new_salary # {'salary': 321}
# # 5.修改大字典
# user_data_dict[target_id] = user_dict
# print(user_data_dict.get(target_id))
# elif choice == '5':
# while True:
# # 1.先获取想要修改的员工编号
# target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# if target_id not in user_data_dict:
# print('员工编号不存在')
# continue
# # 2.字典删除键值对
# user_data_dict.pop(target_id)
# else:
# print('抱歉 暂无该功能编号!!!')
# 2.去重下列列表并保留数据值原来的顺序
# eg: [1,2,3,2,1] 去重之后 [1,2,3]
# l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
# 不考虑顺序的情况下 去重
# s1 = set(l1)
# l2 = list(s1)
# print(l2)
# 考虑顺序
# new_list = []
# for i in l1:
# if i not in new_list:
# new_list.append(i)
# print(new_list)
# 3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
# pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
# linuxs={'kermit','tony','gangdan'}
# 1. 求出即报名python又报名linux课程的学员名字集合
# 2. 求出所有报名的学生名字集合
# 3. 求出只报名python课程的学员名字
# 4. 求出没有同时这两门课程的学员名字集合
# pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
# linuxs = {'kermit', 'tony', 'gangdan'}
# print(pythons & linuxs)
# print(pythons | linuxs)
# print(pythons - linuxs)
# print(pythons ^ linuxs)
# 4.统计列表中每个数据值出现的次数并组织成字典展示
# eg: l1 = ['jason','jason','kevin','oscar']
# 结果:{'jason':2,'kevin':1,'oscar':1}
# 真实数据
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
# 1.先定义结果集空字典
data_dict = {}
# 2.循环列表中每一个数据值
for name in l1: # 'jason' 'kevin'
# 3.判断当前数据值是否在字典的k中
if name not in data_dict: # {'jason':1}
data_dict[name] = 1
else:
data_dict[name] += 1
# data_dict[name] = data_dict.get(name) + 1
print(data_dict)
正文来了
文件操作
1.文件的概念
就是操作系统暴露给用户操作硬盘的快捷方式
eg:双击一个文件其实就是从硬盘将数据加载到内存
ctrl+s保存文件 其实是将内存中的数据刷到硬盘保存
2.代码打开文件的两种方式
方式1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
方式2:
with open('a.txt','r',encoding='utf8')as f1:
with子代码块
ps:with上下文管理好处在于子代码运行结束自动调用close方式关闭资源
"""
open方法的第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母r
D:\a\n\t
r'D:\a\n\t'
以后涉及到路径的编写 推荐加上r
with支持一次性打开多个文件
with open() as f1,open()as f2,open()asf3:
子代码
"""
文件的读写模式
'r' 只读模式:只能读不能写
# 1.文件路径不存在:会直接报错
# with open(r'b.txt', 'r', encoding='utf8')as f:
# print(f.read())
# 2.文件路径存在: 正常读取文件内容
# with open(r'a.txt', 'r', encoding='utf8')as f:
# print(f.read())
'w' 只写模式:只能写不能看
# 1.文件路径不存在:自动创建
# with open(r'b.txt', 'w', encoding='utf8') as f:
# pass
# 2. 文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
"""强调:换行符需要自己添加 并且再后续数据读取比对的时候也一定要注意它的存在
"""
'a' 只追加模式:文件末尾添加数据
# 1.文件路径不存在:自动创建
# with open(r'c.txt', 'a', encoding='utf8') as f:
# pass
# 2. 文件路径存在:自动在末尾等待追加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('放假七天和上班七天感觉是完全不一样的')
"""
当我们在编写代码的时候 有些部分不知道写什么具体代码 但是也不能空着不写
这个时候可以使用关键字
pass
...
只补全语法不执行功能 本身没有任何的含义
"""
文件操作模式
t 文本模式
默认的模式 我们上面所写的 r w a 其实全称是rt wt at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码
b 二进制模式(bytes模式)
不是默认的模式 需要自己指定 rb wb ab
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定encoding参数 因为它已经是二进制模式了 不需要编码
二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!
文件诸多方法
1.read()
一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号还可以填写数字 在文本模式下 表示读取几个字符
2.for 循环
一行行读取文件内容 避免内存溢出现象的产生
3.readline()
一次只读一行内容
4.readlines()
一次性读取文件内容 会按照行数组织成类列表的一个个数据值
5.readable()
判断文件是否具备读数据的能力
6.write()
写入数据
7.writeable()
判断文件是否具备写数据的能力
8.writelines()
接收一个列表 一次性将列表中所有的数据值写入
9.flush()
将内存中文件数据立刻刷到硬盘 等价于ctrl+s
文件内光标的移动
with open(r'a.txt', 'rb') as f:
print(f.read())
f.seek(0,0)
print(f.read())
f.seek(0, 0)
print(f.read())
# print(f.read(2).decode('utf8'))
# f.seek(-1, 2)
# print(f.tell()) # 返回光标距离文件开头产生的字节数
"""
seek(offset, whence)
offset是位移量 以字节为单位
whence是模式 0 1 2
0是基于文件开头
文本和二进制模式都可以使用
1是基于当前位置
只有二进制模式可以使用
2是基于文件末尾
只有二进制模式可以使用
"""
# print(f.read(3).decode('utf8'))
文件内光标的移动案例(了解)
import time
with open(r'a.txt', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 没有内容
time.sleep(0.5)
else:
print(line.decode('utf8'), end='')
计算机硬盘修改数据的原理(了解)
硬盘写数据可以看成是在硬盘上刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不可能从中间再分开
硬盘删除数据的原理
不是直接删除而是改变状态 等待后续数据的覆盖才会被真正删除
文件内容修改(了解)
# 修改文件内容的方式1:覆盖写
# with open(r'a.txt', 'r',encoding='utf8')as f:
# data = f.read()
# with open(r'a.txt', 'w', encoding='utf8')as f1:
# f1.write(data.replace('哈哈','嘿嘿'))
# 修改文件内容的方式2:换地方写
'''
先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件
'''
import os
with open('a.txt', 'r', encoding='utf8') as read_f, \
open('.a.txt.swap', 'w', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('小明', 'kevinSB'))
os.remove('a.txt') # 删除a.txt
os.rename('.a.txt.swap', 'a.txt') # 重命名文件
python进阶之路9文件的处理方法的更多相关文章
- python进阶之路之文件处理
Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- Python学习之路4 - 文件操作&编码转换
文件操作 文件操作大概分三步: 把文件打开. 操作文件. 把文件关上. 打开文件 打开文件用open()函数,打开成功后返回一个资源,具体语法如下. open(要打开的文件,打开方式,打开文件的格式, ...
- 深入学习Python解析并解密PDF文件内容的方法
前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...
- 深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
- Python进阶之路---1.4python数据类型-数字
python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print print('hello,python') 1.1pyt ...
- Python进阶之路---1.1python简介
Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...
- python进阶--打包为exe文件
一.Python打包为EXE文件有不少方案,比较常用的有下面两种方式: 1.使用py2exe 详细介绍:http://www.cnblogs.com/jans2002/archive/2006/09/ ...
- python成长之路五-文件操作
1,文件操作 f = open("D:\种子.txt",encoding="utf-8",mode="r") # 打开一个种子.txt文件, ...
- python爬虫之路——基本文件操作
介绍python如何打开文件和读取数据 新建TXT文档,为追加模式: f=open('c;/wendang/demo.txt','a+') content="abcdefg123456789 ...
- Python学习之路5☞文件处理
一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...
随机推荐
- YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来
前言 上一篇博客给大家介绍了使用opencv加载YOLOv5的onnx模型,但我们发现使用CPU进行推理检测确实有些慢,那难道在CPU上就不能愉快地进行物体识别了吗?当然可以啦,这不LabVIEW和O ...
- AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- 创建.NET程序Dump的几种姿势
当一个应用程序运行的有问题时,生成一个Dump文件来调试它可能会很有用.在Windows.Linux或Azure上有许多方法可以生成转储文件. Windows平台 dotnet-dump (Windo ...
- 关于C#Section配置未初始化的问题
转载 https://www.cnblogs.com/lxshwyan/p/10828305.html 如果使用了configSection节点,则configSection必须位于根节点的第0个.A ...
- Dubbo-时间轮设计
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...
- RabbitMq消息手动应答、放回队列重新消费、设置队列消息持久化、分发模式
RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化 消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况. ...
- PLC攻击(一):应用层攻击
转载请注明出处:信安科研人please subscribe my official wechat :信安科研人获取更多安全资讯 参考文献: A Stealth Program Injection ...
- PHP使用PHPmailer类和smtp发送邮件
开启邮件smtp服务 设置授权码 引入phpmailer类,smtp类本地下载https://github.com/PHPMailer/PHPMailer //下载PHPMailer并开启php_op ...
- Codeforces Round #834 (Div. 3) A-G
比赛链接 A 题目 知识点:模拟. 确定开头字母,然后循环比较即可. 时间复杂度 \(O(n)\) 空间复杂度 \(O(n)\) 题解 #include <bits/stdc++.h> # ...
- VS2019 iis无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行
可以检查W3SVC服务与WAS这两个服务是否正在运行. 重启这两个服务就可以正常了