编码的进阶,文件操作,深浅copy

编码的进阶

不同编码之间的010101是不能相互识别的

网络传输,数据存储到磁盘 使用的010101这种二进制,不能使用Unicode编码本去编译   占用字节数太多 占空间 占流量

大背景:python3x版本

str:它在内存中的编码方式:Unicode

但写入文件的内容 传输别人的数据 一般都是str   

矛盾: 传输 储存不能用Unicode  但python3x又要用str操作

所以利用str发送或传输时  ...代码... (转换 将Unicode便把转为非Unicode)

bytes: 一种数据类型 与str几乎一模一样  表现形式  str:'taibai'    bytes:b'taibai'

与str差别: str在内存中的编码:Unicode   bytes编码是非Unicode

                    中文:str 表现形式为'中国'

                             bytes  : b'xe4xb8xadxe5x96xbq

str ---> utf-8 bytes

s1 = '太白'

b1 = s1.encode('utf-8')

print(b1)

终极转换

GB 2312                                 UTF-16

                      Unicode

utf-8                                        gbk

utf-8转化为gbk

s2 = s1.decode('utf-8')  转为Unicode    再转为 s2.encode('gbk')

文件操作的初识

想打开一个文件需要三要素:

文件路径:path

编码方式:utf-8 gbk 等

具体的操作:读 写 读写 写读等

f = .open('路径格式',encoding='编码方式',mode='操作')

print(f.read())

f.close()

打开文件第二种办法:

with open('文件路径',encoding='编码类型',mode='操作类型')as f1

好处是省去了写f.close()

缺点是如果同时操作两个句柄,可能会因为第一个没来得及关闭就去操作下一个,导致第一个没有close,会报错

f 是变量 是文件句柄

open()是python的内置函数

Windows:默认编码 gbk                                           Linux ms:默认编码utf-8

操作文件流程:

1.打开文件,产生一个文件句柄

2.对文件句柄进行相应的操作

3.关闭文件句柄

可能出现的问题:

路径问题

与后面内容构成命令   多加一个

编码问题

编码要与文件储存时的编码保持一致

错误

有的电脑会隐藏文件后缀名   可设置显示后缀名

文件的读

有四种模式 r  r+  rb  r+b

四种模式下,还有五种读文件的不同方式

r    在同一个文件夹下,是相对路径 可以直接写文件名而不用写路径

f1 = open('文件路径',encoding='编码方式')  如果进行读的操作,就不用加mode操作方式

print(fi.read())

f1.close()    全部读取,读取出来的数据类型是str

在r模式中 n代表字符

f1 = open('文件路径',encoding='编码方式') 

print(f1.read(3))

f1.close()    按字符读取

print(f1.readline())    按行读取,写几行这个代码,就读取几行

print(f1.readlines())    会返回给出一个列表 列表的每一个元素就是原文件的每一行

以上四种操作只能操作小文件  大文件全部读取的话会占用内存,导致计算机崩溃

循环读取:

f1 = open('文件路径',encoding='编码方式') 

for line in f1:

    print(line)

f1.close()    每次只输出一行  输出一行之后取输出下一行 不占用内存

rb

以字节的形式读取  带b的一般操作的都是非文字类的文件(图片,视频等)

f1 = open('文件路径',encoding='编码方式',mode='rb') 

print(f1.read())

f.close()         获得文件字节 

文件的写

分为w w+ wb w+b

只有一种模式:全部写入

f1 = open('文件路径',encoding='编码方式',mode='w') 

f.write('写内容')

f.close()   如果没有文件 就创建一个文件 并写入内容

f1 = open('文件路径',encoding='编码方式',mode='w') 

f.write('新内容')

f,close()    如果有文件,先清空,后写入 文件没有close的时候,write多少就写入多少

wb

f1 = open('文件路径',encoding='编码方式',mode='rb') 

content=f1.read()           把图片读取出来

f1.close()

f2 = open('新文件路径',encoding='编码方式',mode='wb') 

f2.write(content)           创建一个新文件,将原文件代码写入

f2.close()

文件的追加

共有四种 a ab a+ a+b

f = open('文件路径',encoding='编码方式',mode='a') 

f.write('内容')         没有文件 创建文件 写入内容     有文件 追加内容至末尾

f.close()

r+ 读写  先读后写

f1 = open('文件路径',encoding='编码方式',mode='r+') 

content=f1.read()

print(content)

f1.write('666')

f1.close()

其他操作

readable  判断文件是否可读

writable   判断文件是否可写

光标默认位置在文件最开始

f1 = open('文件路径',encoding='编码方式) 

f1.seek(int)    按照字节调整光标位置

print(f1.tell(1))        获取光标位置

f1.close()

truncate  对原文件进行截取 ,必须在可写状态下使用  光标调整对他无用 只能从头开始  操作方式必须是r+

文件的改

1.以读的方式打开原文件

2.以写的方式创建一个新文件

3.将原文件的内容读取出来 按照你的要求改成新内容 写入新文件

4.删除原文件

5.将新文件重新命名为原文件

import os                   辅助模块 帮助删除

1.2步  

with open('文件路径',encoding='编码方式)as f1,

    open('文件路径',encoding='编码方式',mode='w')as f2:

3

    old_content=f1.read()

    new_content= old_content.replace('旧','新') 

    f2.write(new_content)

4

    os.remove('原文件')

5

    os.rename('新文件','原文件')

这种方式read全部读取 占用内存太大 因此可以分行读取处理

with open('文件路径',encoding='编码方式)as f1,

    open('文件路径',encoding='编码方式',mode='w')as f2:

for old_line in f1:

    new_line=old_line.replace('旧','新') 

    f2.write(new_line)

    os.remove('原文件')

    os.rename('新文件','原文件')

深浅copy

浅copy

以列表举例  dict set 也可以copy

copy  复制  但不能完全复制

l1 = [1,2,3,[1,2]]

l2=l1.copy()

只是copy了一个外壳  相当于开辟一个新空间装列表 但没有内容 内容用的还是l1  共用一个

给l1添加一个元素 l2不变  但给l1【-1】添加一个元素 l2也跟着添加一个元素

l1 l2  id不同  但包含的内容的id相同  无论在不在一个代码块  都是共用一个

深copy  import copy

l1 = [1,2,3,[1,2]]

l2=l1.copy()

l1[0]  l2[0]   id相同

l1[-1] l2[-1]   id不同

不可变的数据类型共用一份  可变的数据类型l2重新创建一份

深copy不仅复制创建一个新外壳,外壳里面可变数据类型也创建一份新的 但不可变得数据类型就共用一个

 

原文地址:https://www.cnblogs.com/biulo/p/10498992.html