字符编码与文件

字符编码

​ 字符编码只跟文本文件和字符有关,与视频文件、图片文件无关

什么是字符编码?

​ 由于计算机内部只识别二进制,但用户在使用计算机的时候却可以看到各式各样的语言字符

​ 字符编码内部记录了人类字符与数字对应关系的数据

字符编码发展史

1.一家独大

​ 计算机最初是由美国人发明的,美国人为了能够让计算机识别英文字符

​ ASCII码:里面记录了英文字符与数字的对应关系,用一个字节来表示对应关系

​ 所有的英文字符和符号加起来其实不超过127,之所以使用八位是为了后续发现新的语言

​ 必须记住的对应关系有以下两组:

​ A-Z:65-90

​ a-z:97-122

​ 0-9: 48-57

image

2.群雄割据

中国人

​ 为了能让计算机识别中文,我们需要发明另外一套编码表:GBK码

​ GBK码记录了英文中文与数字的对应关系,对于英文还是使用一个字节,对应中文使用两个字节甚至更多字节

​ 两个字节其实也不够表示出所有的中文,遇到生僻字可能需要更多位来表示

日本人

​ 为了能够让计算机识别日文,也需要发明一套编码表

​ shift-JIS码:记录了日文英文与数字的对应关系

韩国人

​ 为了能够让计算机识别韩文,也需要发明一套编码表

​ Euc_kr码:记录了韩文英文与数字的对应关系

3.天下统一

​ 为了能够实现不同国家之间的文本数据能够彼此无障碍交流需要对编码统一

​ unicode(万国码)

​ 统一使用两个及以上字符记录与数字的对应关系

​ utf8(万国码的优化版本)(现在默认使用的编码)

​ 将英文还是用一个字节储存

​ 将中文使用三个字节或更多字节储存

字符编码实操

1.如何解决文件乱码的情况

​ 文件当初以什么编码编的,打开就以什么编码解

2.python解释器版本不同带来的编码差异
python2.X内部使用的编码默认是ASCII

# 文件头
coding:utf8

​ 在python2中定义字符串前面要加一个小u

s = u'你'

​ python3.X内部使用utf8

3.编码与解码

​ 编码:将人类能够读懂的字符按照指定的编码转化成数字

​ 解码:将数字按照指定的编码转换成人类能够读懂的字符

s = '这是中文'
# 编码:
res = s.encode('utf8')
print(res, type(res))  # bytes  在python中直接将该类型看成二进制数据即可

# 解码:
res1 = res.decode('utf8')
print(res1)

文件操作

1.什么是文件?

​ 文件是操作系统暴露给用户操作硬盘的快捷方式(接口)

2.代码如何操作

​ 关键字open()

​ 2.1 利用关键字open打开文件

​ 2.2 利用其他方法操作文件

​ 2.3 关闭文件

语法格式:

open(文件路径,读写模式,字符编码)
文件路径与读写模式是必须的
字符编码是可选的(有些模式需要编码)

文件路径:

​ 相对路径与绝对路径

​ 路径中出现了字母与斜杠的组合产生了特殊含义如何取消

​ 在路径字符串前面加一个r

​ r'/Users/PycharmProjects/1110/a.txt'

open('a.txt')
open(r'/Users/PycharmProjects/1110/a.txt')

res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close  # 管壁文件释放资源

# with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1:  # f1=open() f1.close()
    print(f1.read())
"""以后代码操作文件 推荐使用with语法"""

文件读写模式

r 只读模式

# 路径不存在:直接报错
  with open(r'b.txt', 'r', encoding='utf8') as f:
      pass  # 补全语法结构 没有实际含义
    # 路径存在
  with open(r'a.txt', 'r', encoding='utf8') as f:
      print(f.read())  # 读取文件内所有的内容
      

w 只写模式

# 路径不存在:路径不存在自动创建
  with open(r'b.txt', 'w', encoding='utf8') as f:
      pass

# 路径存在:1.会先清空文件内容  2.再执行写入操作
  with open(r'a.txt', 'w', encoding='utf8') as f:
      # f.read()
      f.write('hello world!\n')
      f.write('hello world!\n')
      f.write('hello world!\n')

a 只追加模式(追加内容)

# 路径不存在:自动创建
with open(r'a.txt','a',encoding='utf8') as f:
    pass
# 路径存在:不会清空文件 在文件末尾添加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('\n你好啊!')
    
"""小总结
	我们所学习的r w a读写模式都只能操作文本文件
"""

文件操作的相关方法

1.读系列

with open(r'a.txt','r',encoding='utf8') as f:
		print(f.read())  # 一次性读取文件内所有的内容
    print(f.readline())   # 每次只读取文件一行内容
    print(f.readlines())  # 读取文件所有的内容,组织成列表,每个元素是文件的每行内容
    print(f.readable())  # 判断当前文件是否具备读的能力

2.写系列

with open(r'a.txt','w',encoding='utf8') as f:
    f.write('hello world')  # 往文件内写入文本内容
    f.write(123)  # 报错 写入内容必须是字符串类型
    f.writelines(['tony','suzy','l'])  # 可以讲列表中多个字符串元素全部写入
    # 字典写入的时候只能将K键写入
    print(f.writeable())  # True
    print(f.readable())  # False
    f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

文件优化操作

with open(r'a.txt','r',encoding='utf8') as f:
  print(f.read())  # 一次性读取文件内所有的内容
   """
    1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
    2.该方法在读取大文件的时候 可能会造成内存溢出的情况
        解决上述问题的策略就是逐行读取文件内容
    """
for line in f:  # 文件变量名f支持for循环,相当于一行行读取文件
    line
    """以后涉及到多行文件内容的情况一般都是采用for循环读取"""

文件操作模式

t 文本模式

​ 1.默认的模式

​ r w a >>> rt wt at

​ 2.该模式所有操作都是以字符串为基本单位(文本)

​ 3.该模式必须要指定encoding参数

​ 4.该模式只能操作文本文件

b 二进制模式

​ 1.该模式可以操作任意类型的文件

​ 2.该模式所有操作都是以bytes类型(二进制)基本单位

​ 3.该模式不需要指定encoding参数

​ rb wb ab

二进制模式读写操作

"""
read()  括号内可以放数字
			在t模式下表示字符个数
			在b模式下表示字节个数
英文字符统一表示一个bytes来表示
中文字符统一使用三个bytes来表示
"""
with open(r'a.txt','rb') as f:
  	# print(f.read())
    print(f.read(6).encode('utf8'))  # 表示从哪里开始读
    
with open(r'a.txt','r',encoding='utf8') as f:
  	# print(f.read())
    print(f.read(4))

文件内光标的移动

"""
控制文件内光标的移动   f.seek()
f.seek(offset,whence)
	offset表示位移量
			始终以字节为最小单位
					正数从左往右移动
					负数从右往左移动
	whenced表示模式
			0 以文件开头为参考系(支持t,b两种模式)
			1 只支持b模式 以光标所在的当前位置为参考系
			2 只支持b模式 以文件末尾为参考系
"""

with open(r'b.txt','rb') as f:
  	print(f.read(4).decode('utf8'))
    print(f.tell())  # 查看光标移动了多少个字节
    f.seek(3,1)
    print(f.read().decode('utf8'))
    
    

文件的内容修改

# 方式1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
    data = f.read()
   # print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
    new_data = data.replace('tony','jason')
    f1.write(new_data)

# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件
posted @ 2021-11-10 21:08  skuukzky  阅读(144)  评论(0)    收藏  举报