day07-字符编码、文件操作

目录:

  • 字符编码

  • 文件处理

一、字符编码:

#1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表
#2. 常用的编码表:ascii、unicode、GBK、Shift_JIS、Euc-kr
#3. 编码操作:编码encode()、解码decode() 

1.1 知识储备

# 电脑三大核心:cpu - 内存 - 硬盘(数据的存取过程),任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行,运行着的应用程序产生的数据,必先存在内存。

# 软件及python解释器读取文件过程:启动 - 读取 - 展示|解释执行,python解释器运行一个py文件(xxx.py)步骤:
    1.将python解释器的代码由硬盘读到内存
    2.将xxx.py以普通文本文件形式读到内存
    3.python读取文件内容 识别python语法  执行相应操作
    ps:普通的文本编辑器与python解释器前两步都是一样的

# python2环境的文件头:# coding: 编码格式

字符编码

#字符编码针对的是文字,那也就意味着这里需要考虑 视频文件 音频文件等其他文件吗?
#不需要,字符编码只跟文本文件有关

#文本编辑器的输入和输出是两个过程
#人在操作计算机的时候输入的是人能够看懂的字符,但是计算机只能识别010101这样的二进制数据,那么:
#输入的字符    >>>(字符编码表)>>>      二进制数字

简介与发展

#1. ascii - 各国编码 - 万国编码
#2. 存取不一致的乱码现象
#3. unicode与utf-8
#字符编码表就是字符与数字的对应关系
    a  0
    b  1
    a 00
    b 01 
    c 11
    d 10

#ASCII码表
#用八位二进制表示一个英文字符   所有的英文字符+符号最多也就在125位左右
0000 0000
1111 1111 

#GBK
#用2Bytes表示一个中文字符 还是用1Bytes表示一个英文字符
0000 0000 0000 0000
1111 1111 1111 1111   最多能表示65535个字符

#基于上面的推导步骤 任何一个国家要想让计算机支持本国语言都必须自己创建一个字符与数字的对应关系
日本人  shift
韩国人  fuck

#万国码unicode
统一用2Bytes表示所有的字符   
a 0000 0000 0010 1010
#1.浪费存储空间
#2.io次数增减,程序运行效率降低(致命)

#当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码
unicode transformation format
#会将unicode的英文字符由原来的2Bytes变成1Bytes
#会将unicode中文字符由原来的2Bytes变成3Bytes

#现在的计算机
    内存都是unicode
    硬盘都是utf-8

需要掌握的

#(需要掌握的)
unicode的两个特点
    1.用户在输入的时候,无论输什么字符都能够兼容万国字符
    2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
    
#(必须掌握的)
    数据由内存保存到硬盘
    1.内存中的unicode格式二进制数字    >>>>编码(encode)>>>>>              utf-8格式的二进制数据
    
    硬盘中的数据由硬盘读到内存
    1.硬盘中的utf-8格式的二进制数据    >>>>>解码(decode)>>>>>             内存中unicode格式的二进制数据

#保证不乱码在于(******)
    文本文件以什么编码编的就以什么编码解

核心

# 编码操作:编码encode()、解码decode()

python2和3的区别

#python2
    将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)
#python3    
    将py文件按照文本文件读入解释器中默认使用utf-8

#文件头:
# coding:utf-8    
    1.因为所有的编码都支持英文字符,所以文件头才能够正常生效

#基于Python解释器开发的软件,只要是中文,前面都需要加一个u
为了的就是讲python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)
 
python3中字符串默认就是unicode编码格式的二进制数

补充:
    1.pycharm终端用的是utf-8格式
    2.windows终端采用的是gbk

字符与字节

重点

#1. 字节的存储方式:8个二进制位
#2. 字符所占字节数:根据编码的不同,所占字节数可能不同
#3. 三种格式字符串:u''、b''、r''

了解

#u、b格式字符串转换: str(b'', encode='utf-8')、bytes(u'', encode='utf-8')

字符编码总结

x = ''
res1 = x.encode('gbk')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1)  # b'\xe4\xb8\x8a'
# bytes类型  字节串类型  你就把它当成二进制数据即可
res2 = res1.decode('gbk')  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)



# 补充:
# 你a他
# 1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes
# 1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit

二、文件操作

灵魂三问

#什么是文件?
    操作系统提供给用户操作复杂硬件(硬盘)的简易的接口

#为什么操作文件
    人或者应用程序需要永久的保存数据

#如何用
    f = open()
    f.read()
    f.close()

重点

#1. 文件操作的三步骤:打开文件 - 使用文件 - 关闭文件
#2. 文件操作三要素:文件源、操作模式、编码
#3. with语法:with open(...) as 别名, ..., open(...) as 别名: pass
#4. 重点方法:read() | write() | readline() | close() | f.flush() | f.seek()

操作模式

#主模式:r | w | a
#从模式:b | t | +
#了解:x | U

操作方法

#读:read() | readline() | readlines()
#写:write() | writelines() | flush()
#光标:seek() | tell()
#特征:encoding | closed

#了解:readable() | writable() | name 

案例

通过python代码操作文件
r取消转义
f = open(r'text.txt',encoding='utf-8')  # 向操作系统发送请求  打开某个文件
# 应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
print(f)  # f是文件对象
print(f.read())  # windows操作系统默认的编码是gbk
f.read()  # 向操作系统发请求 读取文件内容
f.close()  # 告诉操作系统 关闭打开的文件
print(f)
print(f.read())

f = open('/Users/yuanjianwei/PycharmProjects/Python text/text.txt', encoding='UTF-8')
# f = open(r'text.txt', encoding='GBK') :r取消转义(\n,\a等),win系统默认的编码是gbk
print(f)  # f相当于遥控器,文件相当于电视机
# <_io.TextIOWrapper name='/Users/yuanjianwei/PycharmProjects/Python text/text.txt' mode='r' encoding='UTF-8'>
print(f.read())
f.read()  # 向操作系统发请求 读取文件内容
f.close()  # 告诉操作系统 关闭打开的文件
print(f)  # 遥控器还在,但是电视机关了
print(f.read())  # 报错:ValueError: I/O operation on closed file.

文件上下文操作
with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\
        open(r'D:\Python项目\day07\b.txt',encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它看成是一个遥控器
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())

# 通过 with...as 代替文件的打开关闭(节省内存),
with open(r'text.txt', encoding='UTF-8') as f:
    print(f)  # f为被赋值变量,也就是遥控器
    print(f.read())  # read读取文件内容

案例二

with open(r'text3.txt', mode='w+', encoding='utf-8') as f:
    print(f.write('You love who ?'))
    print(f.readable())  # 是否可读?True
    print(f.writable())  # 是否可写?True
    print(f.read())  # 不报错,但也没有输出值

with open(r'D:\Python项目\day07\a.txt', mode='r', encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    print(f.read())  # 一次性将文件内容全部读出

操作文件单位的方式
    t 文本文件   t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码
    b 二进制  一定不能指定encoding参数
with open(r'D:\Python项目\day07\1.jpeg', mode='rb') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    print(f.read())  # 一次性将文件内容全部读出

r模式在打开文件的时候 如果文件不存在 直接报错
文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下
with open(r'a.txt',mode='r',encoding='utf-8') as f:
with open(r'a.txt','r',encoding='utf-8') as f1:  mode关键字可以不写
print(f.readable())  # 是否可读
print(f.writable())  # 是否可写
print(">>>1:")
print(f.read())  # 一次性将文件内容全部读出
print('>>>2:')
print(f.read())  # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容
for line in f:  # f可以被for循环 每for循环依次 读一行内容
    print(i)  # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
print(f.readline())  # 只读取文件一行内容
print(f.readline())
print(f.readline())
print(f.readline())

with open(r'/Users/Python text/text.txt', 'r', encoding='utf_8') as f1:
    print(f1.readline())  # 取第一行
    print(f1.readline())
    print(f1.readlines())  # 取全部行
    print(f1.readlines())  # 只能取到[],因为上一行已经全部读完,光标到最后

w模式:w模式一定要慎用
1.文件不存在的情况下 自动创建该文件
2.当文件存在的情况下 会先清空文件内容再写入
with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\r')
f.write('不不不,你没有翻~')
l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
f.writelines(l)
# 上下等价
for i in l:
    f.write(i)

with open(r'love.txt', 'w', encoding='utf-8') as l1:
    l1.write('不不不,你没有翻车~\n')
    l1.write('不不不,你没有翻车~\n')
    l1.write('不不不,你没有翻车~\n')
    l1.write('不不不,你没有翻车~')
    l1.write('不不不,你没有翻车~')
    l1.write('不不不,你没有翻车~')
    l = ['不sdffs,sdfs有翻~\n', '不sdfsdf不,你sdfsf翻~\n',
         '不sfad不,你没sa翻~\n']
    l1.writelines(l)

a模式
1.当文件不存在的情况下 自动创建该文件
2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    f.write('我是小尾巴\n')

with open(r'love.txt', 'a', encoding='utf-8') as l2:
    print(l2.readable())
    print(l2.writable())
    l2.write('我是小尾巴\n')

 

 


1. 文件复制
2. 文件修改

了解:py文件脚本机制

 

posted @ 2019-07-05 20:56  辕子  阅读(143)  评论(0编辑  收藏  举报