字符编码的与文件处理的补充内容

字符编码:

人类的字符  经过翻译 转换 成数字

翻译的过程遵循的标准即字符编码(就是一个字符与数字一一对应的关系表)

其中

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:a\b\c\d.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\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02Z\x00\x00\x01\x9b\x08\x06\x00\x00\x00\x1c\x07>f\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x16%\x00\x00\x16%\x01IR$\xf0\x00\x00\x8e\x04IDATx^\xed\xbd\x89\x9b$\xdbY\x9f9\xff\xc3x\xd8\x07lK\x80\x8d=\x98\xd1c\

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, 222223333      只更改第一行改成                      11111{00000}, 222223333
44444,55555,6666644444,55555,666667777,888899999                                                 7777,888899999



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模式下操作路径时要写绝对路径去寻找文件,以及新建文件。

 

 



 

posted @ 2018-03-23 18:11  C3的脚印  阅读(392)  评论(0编辑  收藏  举报