字符编码与文件的基本操作
1 > 字符编码的实际应用
1.1 > 编码与解码含义
编码指的就是将人类能够读懂的字符编码变成计算机能够读懂的字符
解码指的就是将计算机能够直接读懂的字符编码解码成人类能够的读懂的字符。
1.2 > 编码(encode)
# 定义一个字符串的变量
s1 = '事已至此 何不一搏'
# 将变量进行编码
print(s1.encode('gbk')) # encode() 这个括号里面填的是你想要将字符串编成哪种字符编码。
# 打印 b'\xca\xc2\xd2\xd1\xd6\xc1\xb4\xcb \xba\xce\xb2\xbb\xd2\xbb\xb2\xab'
'''
当字符串的前面如果加上了字母b,表示的就是数据类型为bytes类型
bytes类型就是指2进制。
'''
1.3 > 解码(decode)
# 定义一个编码过的字符串
res = b'\xca\xc2\xd2\xd1\xd6\xc1\xb4\xcb \xba\xce\xb2\xbb\xd2\xbb\xb2\xab'
# 将进行过编码的数据解码
print(res.decode('gbk')) # decode() 这个括号里面填的是你想要将字符串解码成哪种字符编码。
# 打印 事已至此 何不一搏
1.4 > 如何解决乱码的问题
当我们遇到打开一个软件乱码的时候,可能就是它解码与编码的编码类型不同的原因,所以当我们想要避免乱码的情况,我们就需要将数据的编码和解码同一个编码类型就可以避免了。
res1 = s1.encode('gbk')
print(res1) # 将字符串按gbk类型编码
res2 = res1.decode('euc_kr')
print(res2) # 解码用euc_kr类型,这样就会产生乱码
res3 = res1.decode('gbk')
print(res3) # 当我们用gbk类型解码他就会正常显示了
1.5 > python解释器层面
1.5.1 > python2解释器方面:
在python2解释器当中它的默认的编码是ASCII码,所以我们需要用到两个关键的方法,将字符串可以正常输出
1.5.1 - 1> 文件头
文件头是必须要写在文件的最上方的,它的作用就是告诉解释器指定使用哪种字符编码。格式如下:
1.coding:utf8
2.-*- coding:utf8 -*- # 这是一种美化的写法
1.5.1 - 2> 字符前缀
字符前缀的使用情况是,在使用pyhon2解释器的环境下定义字符串的时候,我们习惯会在前面加上一个 字符u。格式如下:
name = u'你好啊'
1.5.2 > python3解释器方面:
python3解释器在python2解释器的基础上进行了优化,他的默认字符编码就是目前常用的 utf - 8.
2 > 文件操作简介
2.1 > 文件的含义
文件的含义就是操作系统暴露给用户可以直接操作硬盘的快捷方式。
2.2 > 打开文件的语法结构
# 结构一:(不推荐使用)
f = open() # 打开一个文件就必须要使用close将其关闭
f.close()
# 结构二:(推荐使用)
with open() as f:
pass # 这中结构在使用时不需要考虑关闭文件,因为它会自动在使用完文件后关闭文件。
2.3 > 使用关键字打开文件
# 我们在打开文件时需要写上文件的路径,例如:
open(r'a.txt') # 这是相对路径
open(r'D:\xx\xx\a.txt') # 这是绝对路径
# 我们会在写路径的时候为了防止特殊符号产生意义,一般就是直接加r
# 使用open关键字打开文件时我们要注意一些几种情况
'''
open(文件的路径,文件的操作模式,文件的编码)
1.文件的路径是必要的写上的
2.文件的操作模式和文件编码,可写可不写
'''
# 读取文件内容 read()
print(res.read()) # 读取文件内容
res.close() # 关闭文件
3 > 文件的读写模式
3.1 > r 模式
r 模式是一种只读模式,所以它只能读不行进行编写。当文件路径不存在时,它会直接报错。当文件路径存在时,它会正常打开文件并等待内容读取,将文件中的内容一次性读取。
with open(r'a.txt', 'r', encoding='utf8') as f:
pass # pass 在这里的作用就是用来补全语法,本身没有任何的功能
'''
当文件存在,一次型读取文件内容
当文件不存在 , 报错
文件只读不能写
输入f.write() 报错
'''
3.2 > w 模式
w 模式是一种只写模式,所以它只能写不行进行读取。当文件路径不存在时,它会直接新建一个文件。当文件路径存在时,它会将文件中的内容先清空, 之后再写入数据。
with open(r'b.txt', 'w', encoding='utf8') as f:
f.write('xxxxxxxxxx\n') # 写入文件内容
f.write('$$$$$$$$$$\r')
'''
假如b.txt不存在新建 b.txt 文件
假如b.txt文件中有内容,就会将文件中的内容全部情况再写上想要写入的内容
\n 表示换行符 \r 表示换行符
如果打印读取文件当中内容
print(f.read()) # 报错
'''
3.3 > a 模式
a 模式是一种追加写的一种模式,它也是只能写不行进行读取。当文件路径不存在时,它会直接新建一个文件。当文件路径存在时,它不会将文件中的内容先清空,而是在文件内容的末尾等待添加新的内容。
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
'''
假如b.txt不存在新建 b.txt 文件
假如b.txt文件中有内容,就会直接在文件结尾添加新内容
f.write('xxxxxx') # 结尾添加内容
print(f1.read()) # 报错
'''
4 > 文件的操作模式
4.1 > t 模式
t 模式是一种默认的模式,是用于操作文本文件的。该模式只能用于操作文本文件,并且需要指定encoding参数。这种模式的读写都是以字符串为最小单位进行的。
4.2 > b 模式
b模式是一种需要自己手动添加的二进制模式。可以操作任意的类型文件,所以字符b是一定不能省略的。它是不需要指定encoding参数的。并且这种模式的读写都是以bytes类型为最小的单位。
5 > 文件内置方法
read() # 一次性读取文件内容
'''
1.执行完之后光标在文件末尾 继续读取没有内容
2.当文件内容特别大的时候 容易造成内存溢出(满了)
'''
readline() # 一次只读一行内容
readlines() # 结果是一个列表 里面的各个元素是文件的一行行内容
readable() # 判断当前文件是否可读
支持for循环 # 一行行读取文件内容(推荐使用) 内存中同一时刻只会有一行内容
write() # 写入文件内容(字符串或者bytes类型)
writelines() # 可以将列表中多个元素写入文件
writable() # 判断文件是否可写
flush() # 相当于主动按了ctrl+s(保存)