# P25 字符编码和文件操作
# 1.文件操作
#open('E:\YoloV5\yolov5-master\python_base\a.txt',encoding='字符编码')
# 2.字符编码
# ASCII ascii用1个字节(8位二进制)代表一个二进制字符 8bit =1Bytes
# gb2312 :规定包含中文在内的自读->数字的对应关系
# GBK; GB2312
# unicode和 UTF-8关系:UTF-8硬盘里面,unicode在内存里面
# 3.文件操作
# 3.1绝对路径
# f =open(r'E:\YoloV5\yolov5-master\python_base\a.txt',encoding='utf-8')# r表示转义字符,utf-8为通用转义字符
# print(f.read()) #读取文件信息
# f.close()#关闭文件
# 3.2相对路径
# f =open(r'a.txt',encoding='utf-8')# r表示转义字符,utf-8为通用转义字符
# print(f.read()) #读取文件信息
# f.close()#关闭文件
# 3.3 当前路径 ../
# f =open(r'../python_base/xuyaoduqudewenjian/a.txt',encoding='utf-8')# r表示转义字符,utf-8为通用转义字符
# print(f.read()) #读取文件信息
# f.close()#关闭读取的文件
# 4.1 上下文管理
# with open(...) as f:
#pass
# with open(r'a.txt',encoding='utf-8') as f:
# print(f.read())
# 一.文本的只读模式(r,默认的rt模式)
# 1.当文件不存在时,会报错
# 2.当文件存在时,文件指针指向文件的开头
# with open('a.txt',mode ='rt',encoding='utf-8') as f:# 默认模型是rt模式,可以省略
# res1 =f.read()
# print('111>>>',res1) #第一次读完了
# res2 =f.read()
# print('222>>>',res2)
# print(f.readable())#用于判断rt模型是否可读
# print(f.writable()) #用于判断rt模型是否可写
# print(f.readline()) #用于读取第一行
# print(f.readline(),end='') # 用于读取第一行
# for 循环遍历文件对象
# for line in f:
# print(line,end='')
# L =[]
# for line in f:
# L.append(line)
# print(L)
#上面的for代码变成一行代替
# print(f.readlines()) #读取多行文件
# # wt模型(只写模式):1.当文件不存在时,新建一个空文档(简单地说是无则创建)
# with open('b.txt',mode='wt',encoding='utf-8') as f:
# pass
# wt模型(只写模式): 2.当文件存在的时候,会清空内容,文件清空我们可以写想要的内容
# with open('b.txt',mode='wt',encoding='utf-8') as f:
# print(f.readable()) #判断是否可读
# print(f.writable()) #判断是否可写
# f.write('樊玉和\n')#一次性写一行
# f.write('郑灿星\n')
# f.write('大海12345\n')
# f.write('567890\n')
# f.write('111\n222\n3333\n') #一次性写多行
# # 把列表内容一行行写入
# info =['大海\n','大海\n','红海\n']
# for line in info:
# f.write(line)
# #上面的一行代码搞定
# info = ['大海\n', '大海\n', '红海\n','樊玉和\n','郑灿星\n']
# f.writelines(info)
# at: 只追加写模式
# 1.当文件不存在时,新建新文档,文件指针跑到文件的末尾(开头就是末尾)
# with open('c.txt',mode='at',encoding='utf-8') as f:
# pass
# 2.当文件存在时,文件指针跑到文件的末尾继续写,与wt的区别是wt模式需要重新写
# with open('c.xls',mode='at',encoding='gbk') as f: #如果utf-8编译模式不可以的话,修改为gbk编译模式
# print(f.readable()) #判断是否可读,不能读
# print(f.writable()) #判断是否可写,可以写
# f.write('大海老师1\n')
# f.write('大海老师2\n')
# f.write('大海老师3\n')
# 总结wt和at模式的区别:
# wt模式:在文件打开不关闭的情况下,连续的写入;清空之前的文件内容;
# at模式关闭了下次打开是在 文件末尾写,所以不会覆盖之前的内容
# 操作二进制文件用b模式,可以操作图片(不需要解码)或者文件格式(需要解码)
# with open('1.png',mode='rb') as f:
# data =f.read()
# print(data,type(data))
# print(type(data))
#
# with open('2.png',mode='wb') as f1:
# f1.write(data) #相当于赋值图片
# 用b模式,也可以对文本文件操作,但是需要解码
# decode :二进制解码成字符
# encode: 字符编码成二进制
# 解码 读的时候转换成字符
# with open('b模式.txt',mode ='rb') as f:
# data =f.read()
# print(data)
# print(data.decode('utf-8'))#文件解码操作utf-8
# 编码 写的时候把字符转换成二进制写入
# with open('wb模式.txt',mode='wb') as f:
# f.write('dahai\n'.encode('utf-8'))
# f.write('123\n'.encode('utf-8'))
# f.write('樊玉和\n'.encode('utf-8'))
# f.write('郑灿星\n'.encode('utf-8'))
# 可读可写模式:(1)r+t; (2)w+t; (3)a+t三种模式
# (1)r+t模式
# with open('可读可写r+t模式.txt',mode='r+t',encoding='utf-8') as f: #这么模式与rt模式一样,在没有文件时会报错,只是多了哥可写操作
# print(f.readable())
# print(f.writable())
# # msg =f.readline()
# msg1 =f.readlines()
# # print(msg)
# print(msg1)
# f.write('xxxxxxxx') #在光标处(末尾写)写入内容
# w+t模式:当文件不存在时,新建一个空文档;当文件存在时,清空文件内容,文件指针跑到文件的开头(即有则清空)
# with open('可读可写w+t模式.txt',mode='w+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# f.write('aaaaa\n')
# f.write('樊玉和\n')
# f.write('郑灿星\n')
# # 指针移动seek(移动的字节数,开头开始0)
# # 从开头开始移动0
# f.seek(0,0)
# print(f.readline())
# f.write('ccccccccc')
# (2)a+t模式
# with open('可读可写a+t模式.txt',mode='a+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# f.write('aaaaa\n')
# f.write('樊玉和\n')
# f.write('郑灿星\n')
# # 指针移动seek(移动的字节数,开头开始0)
# # 从开头开始移动0
# f.seek(0,0)
# print(f.readline())
# f.write('ccccccccc')
# 指针移动 f.seek:分为t模式和b模式
# t模式
# with open('指针移动.txt',mode='rt',encoding='utf-8') as f:
# print(f.read(1))
# # print(f.read(1))
# # print(f.read(1))
# b模式
# with open('指针移动.txt',mode='rb') as f:
# print(f.read(1).decode('utf-8'))#字母开头加上.decode('utf-8'),汉子开头不需要加.decode('utf-8')
# print(f.read(1))#汉字不需要.decode('utf-8'),不加.decode('utf-8')时可以一次读取3个字节即一个汉字
# 指针操作:f.seek(offset,whence)有两个参数:offset:代表控制指针移动的字节数;whence:代表参照什么位置进行移动
# whence =0: 参考文件开头(默认的),特殊???,可以在t和b模式下使用
# whence =1: 参考当前所在的位置,必须在b模式下用
# whence =2: 参考文件末尾,必须在b模式下用
# 一.t模式下
# with open('seek.txt',mode='rt',encoding='utf-8') as f: # t模式按照字符算
# f.seek(2,0)
# print(f.read(1))#read(1)表示制度一个字符(汉字)
# with open('seek.txt',mode='rb') as f: # b模式按照字节算
# f.seek(5,0) #5代表2个字母+一个汉字(一个汉字3个字节)
# print(f.read(3).decode('utf-8'))#read(3)表示移动3个字节数(即一个汉字),并且含有解码.decode('utf-8')
# 二、b模式下 移动的字节数,读的也是字节数
# with open('seek.txt',mode= 'rb') as f:
# f.seek(5,0)
# print(f.read(3).decode('utf-8'))
# whence =1:参考当前所在的位置,必须在b模式下用
# whence =2:参考文件末尾,必须在b模式下用
# whence =1:参考当前所在的位置,必须在b模式下用
# with open('seek.txt',mode='rb') as f:
# msg =f.read(5)
# print(f.tell()) #显示光标所在字节数
# f.seek(3,1)
# print(f.read(3).decode('utf-8'))
# whence =2:参考文件末尾,必须在b模式下用
# with open('seek.txt',mode='rb') as f:
# f.seek(0,2)
# print(f.tell())
# f.seek(-3,2)
# print(f.read(3).decode('utf-8'))
# 检测文件末尾新增的内容
# with open('历史.txt',mode='rb') as f:
# f.seek(0,2)
# while True:
# line = f.readline()
# if len(line) !=0: #如果是0个bytes意味着光标在最后
# print(line.decode('utf-8'),end='')
# import time
# # at模块
# with open('历史.txt',mode='at',encoding='utf-8') as f:
# f.write('%s夏洛转账给大海1个亿\n'%time.strftime('%Y-%m-%d %H:%M:%S'))
# 文件修改及方式一:
# 1.将文件的内容由硬盘全部读入内存
# 2.在内存中完成修改
# 3.将内存中修改后的结果覆盖写回硬盘
# with open('文件修改.txt',mode='rt',encoding='utf-8') as f:
# all_data = f.read()
# with open('文件修改.txt',mode='wt',encoding='utf-8') as f1:
# f1.write(all_data.replace('红黄蓝','大海'))
# 修改文件的方式二:
# 1.以读的方式打开源文件,以写的方式打开一个临时文件
# 2.从源文件中读取一样内容修改完毕后写入临时文件,直接源文件读取完毕
# 3.删掉源文件,将临时文件重命名为源文件
# import os
# with open('文件修改二.txt',mode='rt',encoding='utf-8') as read_f,open('临时文件.txt',mode='wt',encoding='utf-8') as write_f:
# for line in read_f:
# write_f.write(line.replace('大海','夏洛'))
# # 文件修改二删除
# os.remove('文件修改二.txt')
# # 临时文件.txt改为:文件修改二
# os.rename('临时文件.txt','文件修改二.txt')
# 两种修改文件方式的优缺点:
# 方式一:优点:在文件修改的过程中硬盘上始终一份数据
# 缺点:占用内存过多,不适用于大文件
# 方式二:优点:同一时刻在内存中只存在源文件的一行内容,不会过多地占用内存,适用于大文件
# 缺点:在文件修改的过程中会出现源文件与临时文件共存,硬盘上同一时刻会有两份数据,即在修改的过程中会过多的占用硬盘。
# 如何避免乱码:
# 代码混乱或者报错现象(1)
# with open('text1.txt',mode ='w',encoding='shift_jis') as f1: #仅适用于日语
# f1.write('生まれつき役に立つ')
#
# with open('text1.txt',mode='r',encoding='shift_jis') as f1: #当编码是shift_jis正常编码,但是当使用gbk时就是乱码
# a =f1.read()
# print(a)
# 代码混乱或者报错现象(2):英文用什么编码都可以,例如utf-8,gbk,shift_jis等
# with open('text1.txt',mode ='w',encoding='gbk') as f1: #仅适用于日语
# f1.write('I believe')
#
# with open('text1.txt',mode='r',encoding='gbk') as f1: #当编码是shift_jis正常编码,但是当使用gbk时就是乱码
# a =f1.read()
# print(a)
# !!!!!总结非常重要两点!!!
# 1.保证不乱吗的核心原则就是,字符按照什么标准编码,就要按照什么标准解码,此处的标准就是指定的字符编码。
# 2.在内存中写的所有字符,一视同仁,都是unicode编码,比如我们大考编码器,输入一个‘你’,
# 该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。
# 只有在我们往硬盘保存或者基于网络传输时,才能确定‘你’到底是一个汉字,还是一个日本字,这就是unicode
# 转换成其它编码格式的过程。
|