编码和文件操作

字符编码:

1:文本编辑器存取文件原理

存文件: 1先启动文本编辑器

        2写内容 内容都是保存在内存中 断电丢失  但现在的额软件强大可以定期自动保存

         3 ctrl +s 保存内存中的数据 就会被刷到硬盘中永久保存

 

读文件:

       1 启动文本编辑器

       2把文件内容由硬盘读到内存中去

       3文本编辑器把内存中的文件内容打印到屏幕上

 

2:

字符编码

内存中存着二进制编码 输出'你好'是存在内存中,通过一定的转换成机器能识别的二进制数

这个转换要遵循一定的规律 这个规律叫字符编码

 

什么时候有字符编码的概念

x=1

name='小明'

 

程序运行过程:

1 打开 pycharm 解释器运行到内存中

2 把文件内容往内存中读(直接把硬盘中的数据读到内存中)

3在解释对应的二进制显示成python指令但凡是字符就会有字符编码的概念 所以第三步

就有字符编码的感念

 

 

字符编码的发展史

两位表示四中变化     00  01  10  11

八位  2*8       256 种变化

一个英文单词用一个8位二进制表示

1个英文 =  8 bit = 1 Bytes

bit  是二进制位   Bytes 是字节

这叫 ASCII 码

 

 

后来 当中国人使用计算机是 汉子太多  就不能用ASCII 码了

但依然是这个原理中国加到了  16位  2*16= 65536位

中国用  GBK 码

 

用  1 Bytes 表示一个英文  用 2 Bytes 表示一个中文

 

如果你把日本的软件copy到你的电脑硬盘上不能用可以存 但编码格式不一样 不能取

不能做到字符编码的统一

所以就有一个兼容万国的字符编码  就是unicode 编码

 

#######内存中使用   unicode 编码 全世界的字符都建立对应的关系

用2Bytes表示一个字符  对特殊字用更多的bytes 表示

 

在写一个 word文档 不管用英文中文 日文 等 都是由内存转成 unicode 二进制码 再反解成人类的

字符出现在显示器上 。但如果要存储时 就保存在硬盘上 这是如果是英文的字符就会浪费一个字节

的空间

 

所以 就有了一个utf-8的编码  他是Unicode的升级 版  会自动中文 3个字节 英文一个字节

 

那么为什么内存不用utf-8 呢?因为unicode兼容以前的字符编码格式

 

3 保证不乱码

1内存中固定是unicode编码 唯一可以改变是存到硬盘时使用的编码

2要想不乱码应该保证文档当初以什么编码格式存的 就应该 以什么格式取出

 

 

python2 中

coding:utf-8

x='上'

print(x)

往空间放的值是'上'为unicode格式 而Python2 会把 x = '上'这个值转成头文件规定放在内存

如果不写头文件 会默认为  ASCII码  如果 x= 'sadasd'不出错 因为 utf-8兼容ASCII码

如果是x='上'中文出错

 

python3中

coding:utf-8

x='上'

print(x)

 

python3 会把这个值转成unicode码   不会有乱码

 

cmd 是windows提供的终端  在pycharm终端 不会乱码

 

python2 中这样解决

coding:utf-8

x=u'上'           # u 表示 unicode  意思是不用费劲了 就以unicode格式存吧 不乱码

print(x)           加小u 跨平台使用方便

 

python3 不加 因为默认是unicode

 

 

在python2中

coding:utf-8

x='上'

print(x)

print([x])  #  打印 3个字节的 Bytes  ['xe4xb8x8a']   头文件改问gbk  就是二个字节

 

在python2 中有两种字符串类型

unicode

 x=u'上'

 

 unicode

 x= '上'    如果头文件是utf-8 就存成了utf-8 格式

 

python3  只有一种

unicode

x='上'

 

 

 

4 编码与解码
unicode转成其他编码 叫编码  encode**************
其他码 转成 unicode 叫解码  decode*********

python2 中
coding:gbk
x='上'
x.encode('utf-8')   #  这是  gbk 转unicode 所以是 解码
x.decode('utf-8')   # 可以解 但报错 因为存是gbk 解码也要 gbk
改为
x.decode('gbk')
res=x.decode('gbk')
print([res,])  # 内部是[,]表示看二进制数是多少


python 3  中没有解码  decode  只有编码encode 可以编码任意编码**********
x='上'
print(type(x))
res=x.encode('gbk')
print(res)    # 输出有一个b 前缀有一个b  表示 bytes 相当于 二进制
s=res.decode('gbk')
print(s)

总结:
在python3中的字符串类型 str 都是unicode 编码
在python2 中的字符串类型str 都是unicode按照文件头指定的编码
在python2中也可以制造unicode编码的字符串需要在字符串前加  u  跨平台不乱码
所以在python3中的字符串类型可以编码成其他任意字符编码的格式  结果是bytes 类型

# str  转   bytes
x='上'
b=x.encode('utf-8')
print(b)

# bytes  转  str
s=b.decode('utf-8')
print(s)
x='wwwww'
b=x.encode('utf-8')
print(b)
s=b.decode('utf-8')
print(s)

 

 

 

 

文件操作

绝对路径

f = open('d:模特主妇护士班主任.txt',mode='r',encoding='UTF-8')

content = f.read()

print(content)

f.close()          # 关闭文件

 

 

 

f = open('模特主妇护士班主任',mode='rb',)   # b  是指读取内容为图片视频等不指定编码输出是一些二进制btyes

content = f.read()

print(content)

f.close()

 

 

 

对于w:没有此文件就会创建文件    只写w  前提是没有log'文件 没有创建文件  有先将源文件清空在写

f = open('log',mode='w',encoding='utf-8')

f.write('骑兵步兵')

f.close()

 

先将源文件的内容全部清除,在写。

f = open('log',mode='w',encoding='utf-8')

f.write('附近看到类似纠纷')

f.close()

 

 

 

 

f = open('log',mode='wb')

f.write('附近看到类似纠纷'.encode('utf-8'))   #附近看到类似纠纷 是写的文件内容  utf-8是指定的编码

f.close()

 

f = open('log',mode='a',encoding='utf-8')  #原理就是光标默认移到最后一位然后把内容追加到后面

f.write('佳琪')

f.close()

只能有一步操作 两步就报错所以有了'a+'模式

 

 

f = open('log',mode='a+',encoding='utf-8')

f.write('佳琪')

f.seek(0)

print(f.read())

f.close()

 

读写模式  r+

f = open('log', mode='r+', encoding='utf-8')

print(f.read())

f.write('大人,小孩')

print(f.read())

f.close()

 

由原来文件写的内容是python9 ,输出是pytho9 是因为写文件写哪光标移哪

看到就要用f.seek(0)调光标

 

写在前r+模式

f = open('log', mode='r+', encoding='utf-8')

f.write('你')

print(f.read())

f.close()

 

 

 

在文件中存的是python9结果输出hon9 前面3个字节被中文你覆盖掉了

写文件会从头开始写写完光标停在h 上后面就没有覆盖

 

写读文件w +

f=open('log',mode='w+',encoding='utf-8')

f.write('附近')

f.read()

f.close()

输出没有任何值 打开文件是附近,因为写的模式是没有创建有清空在写。不打印任何

想看可以调光标 f.seek()

 

功能详解

1

f = open('log',mode='r+',encoding='utf-8')

content = f.read(3)  # 读出来三个字符

print(content)

f.close()

# 输出  abd 三个字符  或  你好啊三个字符

# 小节:read(3)读出文件的最小单位  为一个字符中英文都是一个字符

 

 

2

 

f = open('log',mode='r+',encoding='utf-8')

# f.seek(3) # 调光标 调到三个字节从第四个字节开始读

# print(f.read())

# f.close()

# 文件中分别写进‘asdfgh’ 和‘附近的二哥’  分别读到  ‘fgh’  和‘近的二哥’

# 小节:utf-8一个中文三个字节  一个英文 一个字节

# seek(3)是安字节定光标

# read(3)是安字符定光标

 

3

 

f= open('log',mode='r+',encoding='utf-8')

f.seek(3)  # 是按照字节定光标的位置

f.tell() # 告诉你光标的位置 安字节

print(f.tell())

print(f.read())

f.close()

 

4

f = open('log',mode='r+',encoding='utf-8')

f.write('佳琪')# 读不出因为光标在最后

count=f.tell()#找光标的位置

f.seek(count-6)# 中文三个字节  两个中文

print(f.read())#读出佳琪

f.close()

 

其他功能

 

f.readable()  # 判断是否可读

line = f.readline()  # 一行一行的读

line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中

f.truncate(4)

 

 

f= open('log',mode='r+',encoding='utf-8')

for line in f:

    print(line)

文件太大不能用

 

 

5

另一种写法 防止忘记关闭文件 f.close()

with open('log',mode='r+',encoding='utf-8') as f:

    f.read()

    print(f.read())

 

可以打开多个文件:

with open('log',mode='r+',encoding='utf-8') as f,

        open('log',mode='w+',encoding='utf-8') as f1:

    print(f.read())

    print(f1.read())

 

# 注册登录

username = input('请输入你要注册的用户名:')

password = input('请输入你要注册的密码:')

with open('list_of_info',mode='w',encoding='utf-8') as f:

    f.write('{} {}'.format(username,password))

print('恭喜您,注册成功')

lis = []

i = 0

while i < 3:

    usn = input('请输入你的用户名:')

    pwd = input('请输入你的密码:')

    with open('list_of_info',mode='r+',encoding='utf-8') as f1:

        for line in f1:

            lis.append(line)

    if usn == lis[0].strip() and pwd == lis[1].strip():

        print('登录成功')

        break

    else:print('账号和密码错误')

    i+=1

原文地址:https://www.cnblogs.com/andy117/p/11005612.html