字符编码和文件操作

字符编码

  • 定义:
    只跟文本文件和字符串有关 与视频文件 图片文件等无关
  • 什么是字符编码
    由于计算机内部只识别二进制 但是用户在使用计算机的时候却可以看到各式各样的语言字符
    字符编码:内部记录了人类字符与数字对应关系的数据
  • 字符编码发展史
    1、一家独大
    计算机最初是由美国人发明,美国人为了能够让计算机识别英文字符
    ASCII码:里面记录了英文字符与数字的对应关系,用一个字节来是对应关系
    所有的英文字符和符号加起来其实不超过127
    之所以使用八位是为了后续发现新的语言

    A-Z:65-90
    a-z:97-122
    这两组数据需要记住!
    2、群雄割据
    GBK码:记录了英文中文与数字的对应关系
    对应中文使用两个字节甚至更多字节
    shift_JIS码:记录了日文英文与数字的对应关系
    Euc_kr码:记录了韩文英文与数字的对应关系
    3、天下一统
    unicode(万国码)
    统一使用两个及以上字符记录字符与数字的对应关系
    utf8(万国码的优化版本)
    将英文还是用一个字节存储,将中文使用三个字节或更多字节存储
    现在默认使用的编码是utf8

字符编码实操

  • 1.如何解决文件乱码的情况
    文件当初以什么编码编的 打开的时候就以什么编码解
  • 2.python解释器版本不同带来的编码差异
    python2.X内部使用的编码默认是ASCII
    文件头:
    coding:utf8
    在python2中定义字符串前面要加一个小u
    s = u'你'
    python3.X内部使用utf8
    """
    自定义文件模板内容
    file
    settings
    Editor
    file and code templates
    python script
    """
  • 3.编码与解码
    编码
    将人类能够读懂的字符安装指定的编码转换成数字
    解码:
    将数字按照指定的编码转换成人类能够读懂的字符
    eg:
    s = '金丹强者恐怖如斯'
    编码:
    res = s.encode('utf8')
    print(res, type(res))
    解码:
    res1 = res.decode('utf8')
    print(res1)
    image

文件操作

  • 1.什么是文件
    文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)
  • 2.代码如何操作文件
    关键字open()
    1.利用关键字open打开文件
    2.利用其它方法操作文件
    3.关闭文件
    路径中出现了字母与斜杠的组合产生了特殊含义如何取消,在路径字符串前面加一个r
    open(r'D:\py20\day08\a.txt')
    res.close() # 关闭文件释放资源
    open(文件路径,读写模式,字符编码)

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()) # 读取文件内所有的内容
f.write('123') # 写文件内容

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()

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读写模式都只能操作文本文件

image

文件操作方法

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('克服一切困难 奥利给!') # 往文件内写入文本内容
f.write(123) # 写入的内容必须是字符串类型
f.writelines(['jason','kevin','tony']) # 可以将列表中多个字符串元素全部写入
print(f.writable()) # True
print(f.readable()) # False
f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
print(f.read()) # 一次性读取文件内所有的内容
for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容
以后涉及到多行文件内容的情况一般都是采用for循环读取

image

二进制模式读写操作

  • 格式
    read() 括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
    英文字符统一使用一个bytes来表示
    中文字符统一使用三个bytes来表示

  • eg
    with open(r'a.txt','rb') as f:
    print(f.read())
    print(f.read(6).decode('utf8'))

文件内光标的移动

控制文件内光标的移动 f.seek()

  • 格式:
    f.seek(offset,whence)
    offset表示位移量
    始终是以字节为最小单位
    正数从左往右移动
    负数从右往左移动
    whence表示模式
    0:以文件开头为参考系(支持tb两种模式)
    1:只支持b模式 以当前位置为参考系
    2:只支持b模式 以文件末尾为参考系
    with open(r'b.txt', 'rb') as f:
    print(f.read(4).decode('utf8'))
    print(f.tell())
    查看光标移动了多少个字节
    image

文件的内容修改

  • 方式1 覆盖
    with open(r'a.txt','r',encoding='utf8') as f:
    data = f.read()
    with open(r'a.txt','w',encoding='utf8') as f1:
    new_data == data.replace('tony','jason')
    f1.write(new_data)
    将原文件内容进行覆盖
  • 方式2 新建
    import os
    with open('a.txt', mode='rt', encoding='utf-8') as read_f,
    open('a.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
    write_f.write(line.replace('SB', 'kevin'))
    os.remove('a.txt') # 删除原文件
    os.rename('a.txt.swap', 'a.txt') # 重命名文件

image

posted @ 2021-11-11 16:11  丶祈安  阅读(92)  评论(0编辑  收藏  举报