• 02: 循环_读写文件_字符编码


    目录:

    1.1 while与for循环     返回顶部

      1、赋值魔法

    #1. 序列解包: 将多个值的序列解开,然后放到序列的变量中。
    x,y,z = 1,2,3
    print(x,y,z)                                #the result : 1 2 3
    x,y = y,x
    print(x,y,z)                                #the result : 2 1 3
    
    #2. 链式赋值: 将同一个值赋给多个变量的捷径
    x = y = z = 110
    print(x,y,z)                            #the result :110 110 110
    View Code

      2、更复杂的条件

    #1. 比较运算符
    x != y                    x不等于y
    x is y                        x和y是同一个对象
    x is not y                 x和y是不同的对象
    x in y                    x是y容器(例如序列)的成员
    x not in y                    x不是y容器(例如序列)的成员
    
    #2. is:同一性运算
    #作用:is运算符看起来和==一样,事实上却不同
    x = y = [1,2,3]
    z = [1,2,3]
    print(x==y==z)                #the result : True
    print(x is y)                #the result : True
    print(x is z)                #the result : False
    
    #3. in: 成员资格运算符
    name = input('what is your name: ')
    if 's' in name:
        print('your name contains the letters "s" ')
    else:
        print("your name does not contain 's' ")    
    View Code

      3、for循环

    age = 66
    count = 0
    for i in range(3):
        guess_age = int(input('age:'))
        if guess_age == age:
            print("right")
            break
        elif guess_age < age:
            print("too small")
        else:
            print("too large")
    else:
        print("you have tried too many times")
    for循环实现猜三次年纪

      4、while循环

        作用:一般来说循环会一直执行到条件为假,或到序列元素用完时,但是有些时候会提前终止一些循环

          1)   break :  直接跳出循环

          2)   continue跳出本次循环进行下一次循环

    age = 66
    count = 0
    while count < 3:
        guess_age = int(input('age:'))
        if guess_age == age:
            print("right")
            break
        elif guess_age < age:
            print("too small")
        else:
            print("too large")
        count += 1
    else:
        print("you have tried too many times")
    while循环实现猜三次年纪

    1.2 读写文件     返回顶部

      1、open函数用来打开文件

        1. open(name[, mode[, buffering]])  打开文件可传的参数

          1. open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。
          2. 模式(mode)和缓冲(buffering)参数都是可选的

        2. 打开文件的模式有

          • r,只读模式(默认)。
          • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
          • a,追加模式。【可读; 不存在则创建;存在则只追加内容;】

          注:  "+" 表示可以同时读写某个文件

          • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
          • w+,写读

          • a+,同a

        3、with语句

          作用:将打开文件写在with中当对文件操作完成后with语句会自动帮关闭文件,避免忘记写f.close()

    with open("data1.txt",'r',encoding = 'utf-8') as f:
        for line in f:
            print(line)
    with读文件

      2、三种读操作比较

        1. readline()每次读取一行,当前位置移到下一行

        2. readlines()读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素

        3. read(size)从文件当前位置起读取size个字节,如果不加size会默认一次性读取整个文件(适用于读取小文件)

    #1. read()一次读取所有内容
    '''aaa111
    bbb222'''
    f = open(r"data.txt")
    print(f.read())
    f.close()
    
    #2. readline(),每次只读取一行,光标下移
    '''
    0: aaa111
    
    1: bbb222
    '''
    f = open(r"data.txt")
    for i in range(2):
        print(str(i) + ": " + f.readline(),)
    
    #3. 一次读取所有,每行作为列表的一个值
    '''['aaa111
    ', 'bbb222
    ']'''
    f = open(r"data.txt")
    print(f.readlines())
    三种读操作举例

       3、使用read()读文件

         1. read(n)读取指定长度的文件

    f = open(r"somefile.txt")
    print(f.read(7))        # Welcome        先读出 7 个字符
    print(f.read(4))        #‘ to ‘                接着上次读出 4 个字符
    f.close()
    read读取指定长度字符串

        2. seek(offset[, whence])          随机访问

          作用:从文件指定位置读取或写入

    f = open(r"somefile.txt", "w")
    f.write("01234567890123456789")
    f.seek(5)
    f.write("Hello, World!")
    f.close()
    f = open(r"somefile.txt")
    print(f.read())                 # 01234Hello, World!89
    从指定位置写入

        3. tell                                        返回当前读取到文件的位置下标

    f = open(r"somefile.txt")
    f.read(1)
    f.read(2)
    print(f.tell())             # 3     3就是读取到文件的第三个字符
    返回读取位置下标

       4、readline()读文件

         作用:readline 的用法,速度是fileinput的3倍左右,每秒3-4万行,好处是 一行行读 ,不占内存,适合处理比较大的文件,比如超过内存大小的文件

    f1 = open('test02.py','r')
    f2 = open('test.txt','w')
    while True:
        line = f1.readline()
        if not line:
            break
        f2.write(line)
    f1.close()
    f2.close()
    readline读取大文件

      5、readlines()读文件

         作用:readlines会把文件都读入内存,速度大大增加,但是木有这么大内存,那就只能乖乖的用readline

    f1=open("readline.txt","r")
    for line in f1.readlines():
        print(line)
    readlines读文件

      6、将data1.txt中内容读取并写入到data2.txt中

    f1 = open('data1.txt','r')
    f2 = open('data2.txt','w')
    
    for line in f1:
        f2.write(line)
    
    f1.close()
    f2.close()
    将data1.txt内容读取到data2.txt

      7、使用eval()方法将文件读取成字典 

    f = open('data1.txt')
    f1 = (f.read())
    data = eval(f1)
    f.close()
    print(data)         # 运行结果: {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
    将文件读取成字典

      8、将文件内容读取成列表

    lock = []
    f = open("password.txt")
    for name in f.readlines():
        lock.append(name.strip('
    '))
    print(lock)
    运行结果: ['aaa 111', 'bbb 222', 'ccc 333']
    View Code

    1.3 字符编码     返回顶部

      1、几种常用编码

        1. ASCII       :  不支持中文

        2. GBK        :  是中国的中文字符,其包含了简体中文和繁体中文的字符

        3.  Unicode :  万国编码Unicode 包含GBK

          1) Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码

          2) 规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536

          3)这里还有个问题:使用的字节增加了,那么造成的直接影响就是使用的空间就直接翻倍了

        4. Utf-8       : 可变长码, 是Unicode 的扩展集

          1)  UTF-8编码:是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类

          2)ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

      3、python2与python3的几个区别 

          1.  Python2默认 编码方式为ASCII Python3  默认编码方式为UTF-8Unicode 的扩展集

          2.  python2中字符串有str和unicode两种类型, python3 中字符串有str和字节(bytes) 两种类型

          3.  python3中不再支持u中文的语法格式

      4、str与字节码(bytes):  python3中字符串两种类型

          比如定义变量: s = "人生苦短"

          1. s是个字符串,python3中字符串本身存储的就是字节码
          2. 如果这段代码是在解释器上输入的,那么这个s的格式就是解释器的编码格式,对于windows的cmd而言,就是gbk。
          3. 如果将段代码是保存后才执行的,比如存储为utf-8,那么在解释器载入这段程序的时候,就会将s初始化为utf-8编码。
          4. bytes是一种比特流,它的存在形式是01010001110这种,但为了在ide环境中让我们相对直观的观察,
              它被表现成了b'xe4xb8xadxe6x96x87'这种形式

      5、unicode与str :  python2中字符串两种类型

          1.  我们知道unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk ......
          2.  python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台

      6、python2和python3中编码转换

          1.  在python3中字符串默认是unicode所以不需要decode(),直接encode成想要转换的编码如gb2312

          2.  在python2中默认是ASCII编码,必须先转换成Unicode,Unicode 可以作为各种编码的转换的中转站 

                   

      7、python2和python3中字符编码转换举例

        1. python2进行字符编码转换

    #!/usr/bin/env python
    #-*- coding:utf8 -*-
    
    ss = '北京市'
    #1、第一步先将utf8的字符串解码成unicode:  str ----> Unicode
    #注:因为上面声明了使用utf8所以这里必须制定用utf8格式才能decode解码成Unicode
    unicode_type = ss.decode('utf8')          # 将utf8的str格式转换成 unicode编码
    print type(unicode_type)                  # type变成:<type 'unicode'>
    
    #2、第二步将unicode转换成gbk
    gbk_type = unicode_type.encode('gbk')     # 将'unicode' encode编码成gbk格式的str
    print gbk_type.decode('gbk')             # 只有将gbk格式的str再deode 解码成 unicode才能显示 "北京市"
    # print type( gbk_type.decode('gbk') )    # 能正常显示的只有:<type 'unicode'> 格式
    例1: python2在文件中进行字符编码转换
    >>> ss = '北京市'
    >>> us = ss.decode('gbk')          # 将gbk格式的str解码成unicode
    >>> us2 = us.encode('utf8')        # 将unicode变成utf8格式的str
    >>> us3 = us2.decode('utf8')       # 由于cmd中默认是gbk所以要先显示正常汉子,还需要解码成Unicode
    >>> print us3
    北京市
    
    >>> print type(us3)
    <type 'unicode'>
    例2: python2在Windows CMD窗口中进行字符编码转换

        2. python3进行字符编码转换

    import sys
    print(sys.getdefaultencoding())       #在python3中打印出默认字符编码: utf-8
    
    s = "你好"
    print(s.encode("gbk"))               #将Unicode转换为gbk:  b'xc4xe3xbaxc3'
    print(s.encode("utf-8"))             #将Unicode转换为utf-8:   b'xe4xbdxa0xe5xa5xbd'
    print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))
    # 1.  s.encode("utf-8")                                                           #将Unicode编码为utf-8
    # 2.  s.encode("utf-8").decode("utf-8")            #将utf-8解码为Unicode在解码时必须指定现在的字符编码“utf-8”
    # 3.  s.encode("utf-8").decode("utf-8").encode("gb2312")                          #将Unicode编码为”gb2312”
    # 4.  s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312")         #将gb2312解码为unicode
    # 注1:encode("utf-8")   encode作用是将Unicode编码编码为指定编码(这里的utf-8是要编码成什么)
    # 注2:decode(“utf-8”)   decode作用是将其他编码转化为Unicode编码(这里的utf-8是指定现在是什么编码)
    python3在文件中进行字符编码转换

      8、顶部的:# -*- coding: utf-8 -*-或者# coding: utf-8目前有三个作用

          1.  如果代码中有中文注释,就需要此声明。

          2.  比较高级的编辑器会根据头部声明,将此作为代码文件的格式。

          3.  程序会通过头部声明,解码初始化 u"人生苦短",这样的unicode对象,(所以头部声明和代码的存储格式要一致)。

       9、python2 字符编码使用原则

           1.  decode early:  在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;

           2.  unicode everywhere:  然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接等操作

           3.  encode late:  最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等

      10、UnicodeDecodeError 解决方法

          reload(sys)
          sys.setdefaultencoding('utf-8')

    作者:学无止境
    出处:https://www.cnblogs.com/xiaonq
    生活不只是眼前的苟且,还有诗和远方。

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/xiaonq/p/7860309.html
Copyright © 2020-2023  润新知