[文件、文件管理、with上下文管理、字符编码]
[文件、文件管理、with上下文管理、字符编码]
1、什么是文件?
文件是操作系统对用户/应用程序操作硬盘的一种虚拟的概念/接口
用户/应用程序
操作系统(文件)
计算机硬件(硬盘)
2、为何要用文件?
# 用户/应用程序可以通过文件将数据永久的保存到硬盘当中
# 即操作文件就是操作硬盘
# 用户/应用程序直接操作的是文件,对文件进行的所有操作都是对操作系统的调用,
# 然后再由操作系统将其转换成具体的硬盘操作
3、如何用文件: open()
# 1、应用程序打开文件,拿到一个文件对象/文件句柄
# 2、调用文件句柄下的读或者写操作
# 3、关闭文件,回收操作系统资源
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
#2. 通过句柄对文件进行操作
data=f.read()
#3. 关闭文件
f.close()
文件句柄 = open('文件路径', '模式')
4、with控制文件读写内容的模式
t和b不能单独使用,必须跟 r w a 连用
控制文件读写内容的模式
# t 文本 (默认模式)
# 1、读写都可以,都是以str(unicode)为单位的
# 2、文本文件
# 3、必须指定encoding = 'utf -8'
# b 二进制/bytes
控制文件读写操作的模式
# r 只读模式 文件不存在时报错,当文件存在时文件指针调到最开始位置
# w 只写模式 文件不存在时则创建,当文件存在时清空
# a 只追加写模式 在文件不存在时创建,在文件存在时指针跳到末尾
r w a模式与t b的应用
# rt:只写模式,文件不存在则报错,文件存在读入
# with open(r'a.txt',mode='rt',encoding='utf-8') as f:
# print(f.read())
# wt:文件不存在则创建,文件存在则清空,指针跳到末尾
# with open(r'a.txt',mode='wt',encoding='utf-8') as f:
# f.write('我是你爹地')
# at:文件不存在则报错,文件存在指针跳到末尾
# with open(r'a.txt',mode='at',encoding='utf-8') as f:
# f.write('我是你爸爸 滚\n')
# rb模式:
# with open(r'a.txt',mode='rb') as f:
# res = f.read()
# print(res.decode('utf-8')) #解码操作指定utf-8
# wb模式:
# with open(r'a.txt',mode='wb') as f:
# f.write('哈哈哈'.encode('utf-8')) #写入指定编码格式
# ab模式:
# with open(r'a.txt',mode='ab') as f:
# f.write('啦啦啦\n'.encode('utf-8'))
f.flush 可以立刻把内容写入硬盘
操作文件的方法
[](javascript:void(0)😉
#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name
5、文件修改的两种方式
第一种方式
# with open('a.txt',mode='rt',encoding='utf-8') as f1:
# res = f1.read() #文件如果过大不建议用此方法
# print(res)
# data = res.replace('haha','baba')
# with open('a.txt',mode='wt',encoding='utf-8') as f2:
# f2.write(data)
第二种方式
# import os #调用功能引用文件
# with open('a.txt',mode='rt',encoding='utf-8') as f,\
# open('.a.txt',mode='wt',encoding='utf-8') as f1:
# for line in f: # 循环依次读出内容
# f1.write(line.replace('baba','aini')) # 判断每一行需要修改的内容修改
# os.remove('a.txt') #移除文件
# os.rename('.a.txt','a.txt') #将新文件的名改成源文件名
一、什么是字符编码
# 编码:字符编码表
# 字符------------------->>>数字
# 解码: 字符编码表
# 字符<<<-------------------数字
#这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
二、字符编码表
# ASCII编码表:只认识英文字符
# 1英文字符对应8bit
# 8bit = 1Byte
# 1024Byte= 1kb
# 1024KB = 1MB
# 1024MB = 1GB
# 1024GB = 1TB
# GBK:支持英文字符和中文字符
# 1个 字符对应16bit-->>2Bytes
# shift — JIS: 支持英文字符和日文字符
# Euc-kr: 韩文字符
# unicode:兼容万国字符
# 与万国字符都有对应关系
# utf - 8 : unicode transform format-8
三、如何保证不乱码
# 1、首先保证存不乱码,如何保证?
# 存内存不用管,因为内存固定使用uncode格式
# 硬盘的编码格式改为UTF-8
# 2、如何保证取不乱
# 解码编码用的同一张编码表
#1、保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码
#2、在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了