python基础之 编码进阶,文件操做和深浅copy

1.编码的进阶html

字符串在Python内部的表示是unicode编码,所以,在作编码转换时,一般须要以unicode做为中间编码
即先将其余编码的字符串解码(decode)成unicode再从unicode编码(encode)成另外一种编码。 decode的做用是将其余编码的字符串转换成unicode编码,如str1.decode(
'gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 encode的做用是将unicode编码转换成其余编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 所以,转码的时候必定要先搞明白,字符串str是什么编码,而后decode成unicode,而后再encode成其余编码

other:
  1.在网络传输过程当中,不能使用Unicode编码去编译数据,可是str又是unicode编码的,只能在传输或者存储过程当中将unicode装转化成非unicode,因此须要(3)
  2.windows: 编码:gbk.
   linux,mac: 编码是utf-8.
  3.bytes数据类型,与str几乎如出一辙.(二进制的形式)
  4.bytes是一种基本数据类型

2.文件操做(文件光标是重点,可能会有坑)python

文件能够从多个维度进行管理:文件重命名,获取文件属性,判断文件是否存在,备份文件,读写文件,打包解压等等。
在python读取文件只须要经过内置函数open来打开文件便可,open函数接受文件名称和打开模式做为参数返回一个文件对象,操做完文件以后,通过文件对象的close方法关闭便可
info = open('456',encoding='utf-8',mode='r')    #要加上编码方式,读取到info文件对象里面
print(info.read()) #经过info文件对象的read方法读取文件的全部内容,并打印
info.close() #关闭这个文件对象
 
 
open函数默认以"r"的方式打开,也能够知道那个文件的打开模式
      r:默认以读的方式打开,若是文件不存在,抛出FileFoundError异常
      w:以写模式打开,若是文件非空,则已有的内容将会被覆盖,若是文件不存在,将建立文件并写入
      a:在文件末尾追加数据的方式写入,没有文件则建立文件写入
      x:建立一个新文件,若是文件存在,则抛出FileExisError异常
      r+:可读写文件。可读;可写;可追加 ,先读后写
      w+:写读
      U:表示在读取时,能够将\r\n自动转换成 \n (与 r 或 r+ 模式同使用, rU或者r+U)
      b:表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注,通常都是非文字的文件,按字节读取
    
    open函数的其余方法
      info.close() #关闭文件
      info.flush() #刷新缓冲区,将缓冲区的数据当即写入到文件
      info.isatty() #判断文件是否链接到终端设备,返回bool值
      info.read(10) #读取文件前10个字符,从文件中读取指定的字符数,默认读取所有,rb模式下是字节
      info.readline(3)) #读取前3个字符,默认每次最多读取一行数据,每行的最后包含换行符'\n'
      info.readlines() #将文件存入到列表中,列表中的么一行就是文件中的每一行
      info.readable #判断文件是否可读,返回布尔值
      info.seek(3) #移动文件读取的指针,若是文件中包含中文,移动指针必须是3的倍数,否则会报错,由于一个中文字符等于3个字节
         seek(0,0) 文件开头 seek(0,1) 当前位置 seek(0,2) 文件最后

      info.seekable #判断文件指针是否可用,返回布尔值
      info.tell() #获取指针位置
      info.truncate() #截断,把指针后面的内容删除,并写入文件,必须在可写模式下操做,读取的是字节
        f = open('text.txt','r+',encoding='utf-8')
        f.seek(9) #把指针移动到第9个字节后面(即第3个中文后面)
        f.truncate() #把第3个中文后面全部的字符删除,并写入文件
        f.close()
      info.writable() #判断文件是否可写,返回布尔值
      info.write() #把字符串写入文件,并返回字符数
      info.writelines() #写一个字符串列表到文件    

    在计算机中,每打开一个文件就须要占用一个文件句柄,而一个进程拥有的文件句柄是有限的,而且文件句柄也会占用操做系统的资源,因此,在打开文件之后要及时关闭文件,避免文件句柄泄露
      1.可使用finally关闭文件句柄,而且在什么状况是都会关闭(可是不提倡,由于python提倡优美,简洁)
        try:
          info = open("test.txt",encoding='utf-8',mode='r')
          peint(info)
        finally:
          info.close()
 
 
      2.使用上下文管理器(会打开文件,而后自动关闭,不用close函数)
        with open('data.txt',encoding='utf-8',mode='r') as info,open('data.txt',encoding='utf-8',mode='w')as info2:
          print(info.read())

    如何读取大文件?(for循环过程当中,每使用一行,便在内存生成一行,用完即回收地址)
       使用上下文管理器和for循环,由于for循环不只能够遍历如字符串,列表,元祖等可迭代序列,还可使用可迭代协议来便利迭代对象,文件对象就实现了可迭代协议
        with open('data',encoding='utf-8',mode=='r') as info:
          for line in info:
            print(line.upper())

    使用print语句也能够将数据写入到文件
      with open ("456","a+",encoding="utf-8") as info:
        print(1,2,'hello,world',sep='\n',file=info) #经过追加读写方式打开文件,并把标准输出(file)写入到文件

    文件的修改:(world,wps等大公司的文件修改都是如此)

       #1,以读的模式打开原文件.
       #2,以写的模式建立一个新文件.
       import os
       with open('abc.txt',encoding='utf-8') as f1,\
          open('abc.txt.bak',encoding='utf-8',mode='w') as f2:
       #3,将原文件内容读取出来,按照要求改为新内容,写入新文件.
            for old_line in f1:
              new_line = old_line.replace('kobe','god')
              f2.write(new_line)
       #4,删除原文件.
       os.remove('abc')
       #5,将新文件重命名成原文件.
       os.rename('abc.txt.bak','abc.txt')linux

 

     各类模式读写关系windows

      

 

 3.深浅copy网络

深浅copy的主要区别在因而否包含可变或者不可变的数据类型

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差别的,若是使用的时候不注意,就可能产生意外的结果,其实这个是因为共享内存致使的结果 拷贝:原则上就是把数据分离出来,复制其数据,并之后修改互不影响。

1.首先先看一个赋值的状况:使用=进行赋值的时候,数据彻底共享
  =赋值是在内存中的同一个内存地址被分别贴上了不一样的标签,
    
若是这个内存地址指向的数据是可变的类型元素,那么使用其中任意一个标签来修改这个数据,另一个也会变化
    若是这个内存地址指向的数据是不可变的类型,那么适用其中任意一个标签来修改这个数据,都会在内存中新建立一个数据,而且另外一个不会变

2.浅拷贝:

如图,这就是浅拷贝的原理,其中l1和l2的id不一样。l2拷贝l1的时候只拷贝了他的第一层,也就是在其余内存中指向了l1的第一层数据,可是l2没法拷贝l1的第二层数据,也就是列表中的列表,因此他就只能指向l1中的第二层数据函数

由此,当修改l1中第二层数据的时候,浅拷贝l1的l2中的第二层数据也随之发生改变,可是指向的第二层的内存地址仍是同样编码

  浅拷贝以后,若是改变了可变的数据类型以后,两者可变类型数据的id不会发生变化,若是改变了不可变数据类型的话,两者改变了的不可变的数据的id才不同

 

 3.深拷贝:spa

 

不管是同一个代码块,不一样代码块下:不只建立一个新外壳(列表),外壳里面的可变的数据类型也建立一份新的,可是不可变的数据类型共用一个.操作系统

import copy
l1 = [1, 2, 3, [11, 22, 33]]
# l2 = copy.copy(l1)  浅拷贝
l2 = copy.deepcopy(l1)

 能进行深浅copy的数据类型 :dict list set3d

返回系列

相关文章
相关标签/搜索