zoukankan      html  css  js  c++  java
  • 编码进阶和文件操作

    编码进阶

    """
    Python3中有两种数据类型(注意是数据类型而不是编码方式):str和bytes。str类型存储unicode数据,用于向人展示数据,既我们所说的明文。bytes类型用于存储字节数据,用于计算机存储和传输
    """
     1 # s1 = '中国'
     2 # str类型用于向人类展示,计算机不认识,想要存储和网络传输必须先将str转化成bytes类型;
     3 # s2 = s1.encode('utf-8') # utf-8中转化成bytes类型,一个中文==3bytes;
     4 # print(s2)
     5 
     6 # 用什么编码的就用什么解码
     7 # s3 = s2.decode('utf-8')
     8 # print(s3)
     9 # 同理GBK编码也是
    10 # ------------------------
    11 # gbk与utf-8的转换
    12 # utf-8<---->unicode<---->gbk
    13 s1 = '中国'
    14 # 首先将字符串编码成bytes类型才能传输
    15 a = s1.encode('utf-8') # 发送bytes类型
    16 # 接收者首先需要将a解码成unicode编码(万国码)
    17 a1 = a.decode('utf-8')
    18 # 在编码成gbk格式用于存储
    19 a2 = s1.encode('gbk')
    20 # 解码gbk查看
    21 a3 = a2.decode('gbk')
    22 print(a3)
    View Code
     1 编码进阶:
     2 # str -----> utf-8 bytes
     3 a = '中国'
     4 b = a.encode('utf-8')
     5 print(b)   # b'xe4xb8xadxe5x9bxbd'
     6 # str -----> gbk bytes
     7 c = a.encode('gbk')
     8 print(c)   # b'xd6xd0xb9xfa'
     9 
    10 # utf-8 bytes ------> str  uniconde
    11 demo = b'xe4xb8xadxe5x9bxbd'
    12 str_l = demo.decode('utf-8')
    13 print(str_l)
    14 
    15 # gbk bytes ------> str  uniconde
    16 demo1 = b'xd6xd0xb9xfa'
    17 str_2 = demo1.decode('gbk')
    18 print(str_2)
    19 
    20 # 终极转换  utf-8 ------> gbk  两者之间的转换必须通过万国码(unicode)
    21 t = b'xe4xb8xadxe5x9bxbd'
    22 # 先将utf-8编码转换成unicode
    23 y = t.decode('utf-8')
    24 # 在将y编码成gbk
    25 u= y.encode('gbk')
    26 print(u)

    文件操作

    文件操作:
    #1. 打开文件的模式有(默认为文本模式):
    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    #3,‘+’模式(就是增加了一个功能)
    r+, 读写【可读,可写】
    w+,写读【可写,可读】
    a+, 写读【可写,可读】

    #4,以bytes类型操作的读写,写读,写读模式
    r+b, 读写【可读,可写】
    w+b,写读【可写,可读】
    a+b, 写读【可写,可读】

    r+ 读写模式:先读后写
    rb 以字节的形式读取,带b的一般操作的都是非文字类的文件.
    read:读取全部内容(文件较大时不可用,用for循环读取)
    r模式:read(n)----n代表读取第几个字符
    rb模式:read(n)---n代表读取第几个字节
    其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
    readlien:读取第一行
    readliens:返回一个list 列表的每个元素是源文件的每一行.
    重点:seek光标移动(按字节移动)中文3个字节,英文一个字节,换行( )是2个字节;
    seek(0,0)把光标移到起始位置
    seek(0,1)当前光标所在位置
    seek(0,2)把光标移到结束位置
    r模式:read(n)----n代表读取第几个字符,只有r模式n代表字符,其他都是按字节读取


    1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
    2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。
     1 常用操作:
     2 def close(self, *args, **kwargs): # real signature unknown
     3         关闭文件
     4         pass
     5 
     6     def fileno(self, *args, **kwargs): # real signature unknown
     7         文件描述符
     8         pass
     9 
    10     def flush(self, *args, **kwargs): # real signature unknown
    11         刷新文件内部缓冲区
    12         pass
    13 
    14     def isatty(self, *args, **kwargs): # real signature unknown
    15         判断文件是否是同意tty设备
    16         pass
    17 
    18     def read(self, *args, **kwargs): # real signature unknown
    19         读取指定字节数据
    20         pass
    21 
    22     def readable(self, *args, **kwargs): # real signature unknown
    23         是否可读
    24         pass
    25 
    26     def readline(self, *args, **kwargs): # real signature unknown
    27         仅读取一行数据
    28         pass
    29 
    30     def seek(self, *args, **kwargs): # real signature unknown
    31         指定文件中指针位置
    32         pass
    33 
    34     def seekable(self, *args, **kwargs): # real signature unknown
    35         指针是否可操作
    36         pass
    37 
    38     def tell(self, *args, **kwargs): # real signature unknown
    39         获取指针位置
    40         pass
    41 
    42     def truncate(self, *args, **kwargs): # real signature unknown
    43         截断数据,仅保留指定之前数据
    44         pass
    45 
    46     def writable(self, *args, **kwargs): # real signature unknown
    47         是否可写
    48         pass
    49 
    50     def write(self, *args, **kwargs): # real signature unknown
    51         写内容
    52         pass
    View Code

     文件的修改

    文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

    方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

     1 import os  # 调用系统模块
     2 
     3 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
     4     data=read_f.read() #全部读入内存,如果文件很大,会很卡
     5     data=data.replace('alex','SB') #在内存中完成修改
     6 
     7     write_f.write(data) #一次性写入新文件
     8 
     9 os.remove('a.txt')  #删除原文件
    10 os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件
    11 
    12 方法一
    方法一

    方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

     1 import os
     2 
     3 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
     4     for line in read_f:
     5         line=line.replace('alex','SB')
     6         write_f.write(line)
     7 
     8 os.remove('a.txt')
     9 os.rename('.a.txt.swap','a.txt') 
    10 
    11 方法二
    方法二

    小练习:

    1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。

    apple 10 3

    tesla 100000 1

    mac 3000 2

    lenovo 30000 3

    chicken 10 3

    通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。

    2,有如下文件:

    -------

    alex是老男孩python发起人,创建人。

    alex其实是人妖。

    谁说alex是sb?

    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

    ----------

    将文件中所有的alex都替换成大写的SB。

  • 相关阅读:
    ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash
    hdu 5437
    poj 1502
    ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
    ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
    ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall
    ACM-ICPC 2018 南京赛区网络预赛 J. Sum
    法里数列
    ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze
    Hashtable 为什么不叫 HashTable?
  • 原文地址:https://www.cnblogs.com/NumerOne/p/11452162.html
Copyright © 2011-2022 走看看