字符编码:
人类的字符 经过翻译 转换 成数字
翻译的过程遵循的标准即字符编码(就是一个字符与数字一一对应的关系表)
其中
ascii : 英文 1bytes
gbk: 中文 2bytes 英文:1bytes
unicode: 任意字符 :2bytes
utf-8: 中文:3bytes 英文1bytes
需要掌握的就是
1、以书面编码存的,就应该以该编码取文件头 #coding:utf-8:用于python解释器读取python文件。所以文件头指定的编码必须跟python文件存储时用的编码一致。
2、编码解码
unicode------编码encode(对下)---->> utf-8
utf-8 ---------解码decode(对上)---->> unicode
python3中str(字符串)是以unicode编码形式存放的
x='你好’
x.encode('utf-8')----->> bytes #由字符串(Unicode编码)转换(编码)成 字节“utf-8 字符编码”
bytes.decode('utf-8')--->>str(unicode) # 由字节 (utf-8)转换(解码)成字符串 Unicode(编码)
3、bytes 类型的用途:
1、存放道文件中(bytes是二进制语言,也就是机器语言,存取方便)
2、基于网络传播,道理同上, 传播也需要二进制语言。
二 文件处理
文件打开的 t 模式
打开文件的三个步骤:
1:f=open(r'c:acd.txt',mode='r',encoding='utf-8')
2.f.read() 根据要求参加操作文件
3.f.close() 关闭文件
打开多个文件的操作
with open('a.txt',encoding='utf-8') as f1,
open('b.txt',encoding='utf-8') as f2,
open('c.txt',encoding='utf-8') as f3:
"”表示不换行的意思, 虽然文件中打印了3行, 但是实际还是在一行的意思。
文件的打开模式:默认是t模式,t不能单独使用,必须是rt,wt,at
r:只读模式
w:只写模式
a:只追加写模式
操作方法
f.read() 只读,读出所有的该文件内容,光标移动到文件末尾,当成一个大的字符串
f.readline() 读一行内容, 光标移动到第二行首部
f.readines() 读取每一行内容, 存放于列表中
循环读取每一行
f=open('a.txt',mode='r',encoding='utf-8') for line in f: print(line,end=''了解:
f.readable() #文件是否可读的
f.writable() #文件是都可写的
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b.则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
文件打开的 b 模式
强调
1、 与t模式类似 不能单独使用,必须是rb,wb,ab
2、 b模式下读写都是以bytes单位的
3、 b模式下一定不能指定encoding 参数
rb模式 只读
with open('11.png',mode='rb') as f: data=f.read() print(data) date的字符编码bytes模式 #打印结果b'x89PNG x1a x00x00x00 IHDRx00x00x02Zx00x00x01x9bx08x06x00x00x00x1cx07>fx00x00x00x01sRGBx00xaexcex1cxe9x00x00x00x04gAMAx00x00xb1x8fx0bxfcax05x00x00x00 pHYsx00x00x16%x00x00x16%x01IR$xf0x00x00x8ex04IDATx^xedxbdx89x9b$xdbYx9f9xffxc3xxd8x07lKx80x8d=x98xd1c
wb 模式 只写模式
with open('b.txt',mode='wb') as f: a= '月月,你去哪' f.write(a.encode('utf-8')) # 原文件清空, 覆盖, 只有一个新文件里面的内容 月月你去哪
ab 模式 只追加可写模式
with open('b1.txt',mode='ab',)as f: f.write('你好'.encode('utf-8'))
3.了解部分
'+’表示同事读写某个文件
r+ 读写[可读,可写]
w+ 写读[可读,可写]
a+ 写读[可读 ,可写]
三、文件的修改方式
第一种方式:
1:先把文件内容全部读入内存
2:然后在内存中完成修改
3:在把修改后的结果覆盖写入原文件
缺点:会在文件内容过大的情况下,占用过多的内存。
例如:
要把 b.txt 文件里
11111, 22222, 3333 只更改第一行改成 11111{00000}, 22222, 3333 44444,55555,66666, 44444,55555,66666, 7777,8888,99999 7777,8888,99999 with open('b.txt',mode='r',encoding='utf-8')as f: data =f.read() data=data.replace('11111','11111{00000}') with open('b.txt',mode='w',encoding='utf-8') as f: f.write(data)
第二种方式
以读的方式打开原文件, 以写的方式打开一个新文件,,然后通过for循环 把需要更改的那一行更改掉, 然后把原文件删掉, 把新文件命名为原文件名
imports os
import os with open('b.txt',mode='r',encoding='utf-8') as f, open('c.txt',mode='w',encoding='utf-8')as f1: for line in f: if '11111'in line: line=line.replace('11111', '11111{00000}') f1.write(line) os.remove('b.txt') os.rename('c.txt','b.txt')
copy 文件的操作方式:
将A文件的内容拷贝到B文件中,imports sys .
import sys source_file=sys.argv[1] dst_file=sys.argv[2] with open(r'%s' %source_file,mode='rb') as read_f,open(r'%s' %dst_file,mode='wb') as write_f: for i in read_f: write_f.write(i)
在cmd模式下操作路径时要写绝对路径去寻找文件,以及新建文件。