内容回顾

  • 字典内置方法

    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文件的处理方法的更多相关文章

  1. python进阶之路之文件处理

    Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  2. Python学习之路4 - 文件操作&编码转换

    文件操作 文件操作大概分三步: 把文件打开. 操作文件. 把文件关上. 打开文件 打开文件用open()函数,打开成功后返回一个资源,具体语法如下. open(要打开的文件,打开方式,打开文件的格式, ...

  3. 深入学习Python解析并解密PDF文件内容的方法

    前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...

  4. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  5. Python进阶之路---1.4python数据类型-数字

    python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print     print('hello,python')   1.1pyt ...

  6. Python进阶之路---1.1python简介

                            Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...

  7. python进阶--打包为exe文件

    一.Python打包为EXE文件有不少方案,比较常用的有下面两种方式: 1.使用py2exe 详细介绍:http://www.cnblogs.com/jans2002/archive/2006/09/ ...

  8. python成长之路五-文件操作

    1,文件操作 f = open("D:\种子.txt",encoding="utf-8",mode="r") # 打开一个种子.txt文件, ...

  9. python爬虫之路——基本文件操作

    介绍python如何打开文件和读取数据 新建TXT文档,为追加模式: f=open('c;/wendang/demo.txt','a+') content="abcdefg123456789 ...

  10. Python学习之路5☞文件处理

    一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...

随机推荐

  1. JavaScript基本语法(JavaScript代码嵌入方式与声明和使用变量)

    .JavaScript代码嵌入方式 #①HTML文档内 JavaScript代码要写在script标签内 script标签可以写在文档内的任意位置 为了能够方便查询或操作HTML标签(元素)scrip ...

  2. Selenium+Python系列(二) - 元素定位那些事

    一.写在前面 今天一实习生小孩问我,说哥你自动化学了多久才会的,咋学的? 自学三个月吧,真的是硬磕呀,当时没人给讲! 其实,学什么都一样,真的就是你想改变的决心有多强罢了. 二.元素定位 这部分内容可 ...

  3. Linux系统安装宝塔面板教程

    # Linux系统宝塔安装教程 注意:安装宝塔面板的前提条件 首先要有一台服务器或者使用linux系统的虚拟机. 安装前请确保是[全新的机器].必须是没装过其它环境的新系统,如Apache/Nginx ...

  4. 学习ASP.NET Core Blazor编程系列八——数据校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  5. 中国制霸生成器「GitHub 热点速览 v.22.42」

    火遍推特的中国制霸生成器本周一开源就占据了两天的 GitHub Trending 榜,不知道你的足迹遍布了多少个省份呢?同样记录痕迹的 kanal 用了内存读写方式解决了 Rust 的消息处理问题,P ...

  6. Spring源码知识

    bean的生命周期: 实例化:在堆空间中申请内存,使用反射来实现:(createBeanInstance) 自定义属性赋值(setter).容器对象属性赋值(invokeAwareMethods) 前 ...

  7. 走进shell

    走进shell 在Linux早起,还没有出现图形化,超哥和其他系统管理员都只能坐在电脑前,输入shell命令,查看控制台的文本输出. 在大多数Linux发行版里,例如centos,可以简单的用组合键来 ...

  8. Linux系统文件与启动流程

    Linux系统文件与启动流程 /etc初始化系统重要文件 /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件 /etc/resolv.conf:Linux ...

  9. Kubeadm部署Kubernetes

    Kubeadm部署Kubernetes 1.环境准备 主机名 IP 说明 宿主机系统 k8s-master 10.0.0.101 Kubernetes集群的master节点 Ubuntu2004 k8 ...

  10. 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解

    本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...