Python全栈-day6-day7
Posted 燕云十八骑_Z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈-day6-day7相关的知识,希望对你有一定的参考价值。
一、字符编码
1.编码基础
定义:人在使用计算机时,使用的是人类能够读懂的字符,使用者必须通过一张字符和数字间的相对应关系表实现人机交互,这一系列标准称为字符编码
Python应用中解决核心字符串乱码的最佳方法:用什么格式编码,就用什么格式解码
二、文件处理
1.文件基础
1)定义
计算机系统分为:计算机硬件,操作系统,应用程序三部分。python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件。实际上,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
2)操作文件的流程:
a.打开文件,得到文件句柄并赋值给一个变量
b.通过句柄对文件进行操作
c.关闭文件
2.Python中文件操作
1)打开文件的过程
# 打开文件,得到文件句柄并赋值给一个变量 f=open(\'test.txt\',\'r\',encoding=\'utf-8\') #默认打开模式就为r,即只读模式 # 通过句柄对文件进行操作 data=f.read() # 关闭文件 f.close()
打开文件的执行过程:
a.应用程序想操作系统发起系统调用open()请求
b.操作系统打开文件,将文件内容加载到内存中,并返回一个文件句柄给应用程序
c.应用程序将文件句柄赋值给 f
2)open()方法介绍
open(r\'文件路径\',mode=\'打开方式\',encoding=\'编码格式\')
r作用:避免文件路径中的特殊字符例如\'\\\'被强制转义,导致路径无法识别
打开方式:r/w/a(只读只写追加等)
编码格式:应用程序打开文件时,必须制定其打开的编码格式,否则有可能出现乱码
3)文件打开的模式
打开文件的模式有(默认为文本模式): r 只读模式 默认模式,文件必须存在,不存在则抛出异常 w 只写模式 不可读;不存在则创建;存在则清空内容 a 追加写模式 不可读;不存在则创建;存在则只追加内容 对于非文本文件,只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,
使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注意:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 了解部分: + 表示可以同时读写某个文件 r+ 读写可读,可写 w+ 写读可读,可写 a+ 写读可读,可写
3.操作文件的方法
读文件操作:
1)read()
# 读取文件所有内容,光标移动到文件末尾 f = open(r\'test.txt\',\'r\',encoding=\'utf-8\') prit(f.read()) f.close()
2)readline()、readlines()
# f.readline() 读取一行内容,光标移动到第二行首部 # f.readlines() 读取每一行内容,存放于列表中 # 单行读取文件 print(f.readline()) # 多行读取,且转化为列表输出 print(f.readlines())
3)readable()
# 判断文件是否可读 print(f.readable())
读文件:
1)write()
# 只写模式 # 注意: # 1.文件存在时,清空原来的内容 # 2.文件不存在是,创建空文件 # 3.默认不会自动换行写入 f = open(r\'log.txt\',\'w\',encoding=\'utf-8\') #默认是wt f.write(\'第一行\\n\') f.write(\'第二行\\n\') # 追加写的模式 # 注意: # 1.文件存在时,光标移动到文件末尾,且将内容追加到文件默认 # 2.文件不存在是,创建空文件 f = open(r\'log.txt\',\'a\',encoding=\'utf-8\') #默认是wt f.write(\'第一行\\n\') f.write(\'第二行\\n\') f.close()
2)其他内置方法
f.writable() #判断文件是否可读 f.writelines() #以列表形式,多行写入
4.练习
1)循环读取文件
# open(r\'文件路径\',mode=\'打开方式\'encoding=\'编码格式\') with open(r\'log.txt\',mode=\'r\',encoding=\'utf-8\') as file: for line in file: time.sleep(1) print(line,end=\'\')
2)简单写文件,并且实现写入的新内容总是置于文件末尾
with open(r\'log.txt\',mode=\'a\',encoding=\'utf-8\') as file: file.write(\'第一天\\n\')
3)文件打开之b模式
# 1.必须和其它模式组合使用,rb\\wb\\ab # 2.b模式下读写都是以bytes为单位 # 3.b模式下不能指定encoding和decoding模式 # rb模式 with open(r\'120.jpg\',\'rb\') as f: data = f.read() print(data) print(type(data)) with open(r\'zhang.txt\',\'rb\') as f: data = f.read() print(data) print(data.decode(\'utf-8\'),end=\'\') print(type(data)) # wb模式 # 不同编码格式写入,查看打开出现的情况 with open(r\'120.txt\',\'wb\') as f: msg = \'你是猪吗?\' f.write(msg.encode(\'gbk\')) with open(r\'120.txt\',\'wb\') as f: msg = \'你是猪吗?\' f.write(msg.encode(\'utf-8\')) # ab模式 with open(r\'120.txt\',\'ab\') as f: f.write(\'张哈哈\'.encode(\'utf-8\')) # 可以看出.jpg以bytes的形式被存储和打开了 with open(r\'120.jpg\',\'rb\') as f: for line in f: print(line)
5.作业:文件修改
1)修改文件的实际
# 修改文件方式一: # 1.先把文件全部读到内存中 # 2.然后在内存中完成修改 # 3.再把修改后的结果覆盖到源文件中 # 缺点:会在文件内容过大的情况下耗费过多的内存 with open(r\'修改文件.txt\',\'r\',encoding=\'utf-8\') as f: data = f.read() data = data.replace(\'zhang\',\'你是猪吗?\') with open(r\'修改文件.txt\',\'w\',encoding=\'utf-8\') as f: f.write(data) # 修改文件方式二: # 1.以读的方式打开原文件 # 2.以写的方式拷贝到新文件 import os with open(r\'修改文件.txt\',\'rt\',encoding=\'utf-8\') as src_f,\\ open(r\'修改文件.txt.swap\',\'wt\',encoding=\'utf-8\') as dst_f: for line in src_f: if \'你是猪吗?\' in line: line = line.replace(\'你是猪吗\',\'啊哈哈\') dst_f.write(line) os.remove(\'修改文件.txt\') os.rename(\'修改文件.txt.swap\',\'修改文件.txt\')
2)实现文件拷贝
rst_file = input(\'原文件路径>>\') dst_file = input(\'目标文件路径>>\') with open(r\'%s\' %rst_file,\'rb\') as src_f,\\ open(r\'%s\' %dst_file,\'wb\') as dst_f: for line in src_f: dst_f.write(line)
3)拷贝文件和修改文件程序
# 编写程序,提供两种可选功能: # 1)拷贝文件 # 2)修改文件 # 用户输入操作的编码,根据用户输入的编号 # 执行文件拷贝(让用户输入原文件路径和目标文件路径) # 或修改操作 import os print(\'选择模式:\') warm = \'\'\' 1 拷贝文件 2 修改文件 输入quit退出 \'\'\' print(warm) while True: choice = input(\'选择操作>>\').strip() if choice == \'1\': src_file = input(\'输入原文件路径>>\').strip() dst_file = input(\'输入目标文件路径>>\').strip() with open(r\'%s\' %src_file,\'rb\') as src,\\ open(r\'%s\' %dst_file,\'wb\') as dst: for line in src: dst.write(line) elif choice == \'2\': dst_f = input(\'输入要修改的文件路径>>\').strip() msg_old = input(\'输入要修改的内容>>\').strip() msg_new = input(\'修改后的内容>>\').strip() # # 方法一: # with open(r\'%s\' %dst_f,\'r\',encoding=\'utf-8\') as f_old: # data = f_old.read() # data = data.replace(msg_old,msg_new) # with open(r\'%s\' %dst_f,\'w\',encoding=\'utf-8\') as f_new: # f_new.write(data) # 方法二: dst_f_swap = input(\'临时交换的文件名>>\') with open(r\'%s\' %dst_f,\'r\',encoding=\'utf-8\') as f_old,\\ open(r\'%s\' % dst_f_swap,\'w\',encoding=\'utf-8\') as f_new: for line in f_old: if msg_old in line: line = line.replace(msg_old,msg_new) f_new.write(line) os.remove(dst_f) os.rename(dst_f_swap,dst_f) elif choice == \'quit\': break else: print(\'没有这个选项,请重新输入...\')
补充说明:资源回收
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收 回收方法为: 1)f.close() #回收操作系统级打开的文件 2)del f #回收应用程序级的变量 其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close() 推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文 with open(\'a.txt\',\'w\') as f: pass with open(r\'test.txt\',\'r\',encoding=\'utf-8\') as f: data=f.read()
以上是关于Python全栈-day6-day7的主要内容,如果未能解决你的问题,请参考以下文章
Python3.X全栈-Day07-IP地址以及虚拟机网络模式初识
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段