zoukankan      html  css  js  c++  java
  • 编码的进阶,文件操作,深浅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不仅复制创建一个新外壳,外壳里面可变数据类型也创建一份新的 但不可变得数据类型就共用一个

     

  • 相关阅读:
    国际关注,Panda 交易所获悉美银监机构批准特许银行托管加密资产
    Panda 交易所快报 央行数字货币测试进入C端流量入口
    Panda交易所获悉,五地股权市场获批参与「区块链建设试点」
    K2“拍了拍”你,这里有你想要的医药行业整体解决方案—K2 BPM
    K2 BPM 给你不一样的产品体验,有兴趣了解一下吗?
    BPM产品解读之规则设计器-K2 BPM-工作流引擎
    idea 使用Springboot 编译报错
    vue 表格中的下拉框单选、多选处理
    Kibana的安装和使用
    .net core 如何向elasticsearch中创建索引,插入数据。
  • 原文地址:https://www.cnblogs.com/biulo/p/10498992.html
Copyright © 2011-2022 走看看