• 2 python第三章文件操作


    1、三元运算

    三元运算又称三目运算,是对简单的条件语句的简写,如:
    
    简单条件语句:
    
    if 条件成立:
        val = 1
    else:
        val = 2
    改成三元运算:
    
    val = 1 if 条件成立 else 2

     2、简体中文Windows操作系统中,ANSI 编码代表 GBK 编码

    在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码
    
    记事本默认是以ANSI编码保存文本文档的,而正是这种编码存在的bug招致了上述怪现象。假如保存时选择Unicode、Unicode (Big Endian)、UTF-8编码,就正常了。
    此外,假如以ANSI编码保存含有某些特别符号的文本文档,再次打开后符号也会变成英文问号。
    
    如果不知道文本模式的编码格式,需要读取时,mode='rb',二进制模式,数据读到内存里直接是bytes格式(字节类型),如果想内容,还需要手动decode,
    需要下载pip3
    问:假如你不知道你要处理的文件是什么编码可怎么办呢?
    
    import chardet
    
    f = open('log',mode='rb')
    data = f.read()
    f.close()
    
    result = chardet.detect(open('log',mode='rb').read())
    print(result)
    输出:
    
    {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
    注意:
    
    文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
    硬盘上保存的文件都是某种编码的0101010,打开时需要注意: rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示 r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的
    010101010101,在Python中用字符串类型表示

     3、循环文件

    循环文件:
    为避免读取文件过多占内存,可以循环文件一次取一行
    
    file = open('test.txt','r+',encoding='utf-8')
    f = file.readlines()
    for i in f:
        print(i)
    文本中无换行,这样读取出现换行
    
    整个读取直接读取该不会变:f = file.read()
    
    单个执行时:’1,Alex Li,22,13651054608,IT,2013-04-01
    '
    print会执行字符串自带的换行符
    
    1,Alex Li,22,13651054608,IT,2013-04-01
    
    2,Jack Wang,28,13451024608,HR,2015-01-07
    
    3,Rain Wang,21,13451054608,IT,2017-04-01
    
    4,Mack Qiao,44,15653354208,Sales,2016-02-01
    
    消除 输出的 空行:
    for i in f:
        #strip() #方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
        i = i.strip()
        print(i)

     4、写入与读取的编码格式必须相同

    f = open('test.txt','wb')
    f.write('hao'.encode('gbk'))
    这种
    
    所以如果写入的是二进制,那么打开文件的时候也需要以二进制的形式打开。

     5、tell、seek,truncate()、找的是字节

    tell,seek 找的字节
    
    read(size) 字符
    
    清空文件truncate() 按字节
    
    def modify_text():
     
        with open('test.txt', "r+") as f:
     
        read_data = f.read()
     
        f.seek(0)
     
        f.truncate() #清空文件
     
        f.write(read_data.replace('apple', 'android'))
    
     def truncate(self, *args, **kwargs): # real signature unknown
            按指定长度截断文件
     f.truncate(size)指定长度的话,就从文件开头开始截断指定长度,
     f.truncate() 
    不指定长度的话,就从光标当前位置到文件尾部的内容全去掉。上题中光标在文本末尾

    6、对文件增删改查

    对文件操作增删改查
    
    如果采用 file = open(),这种方式,一定要加 file.close(),不然操作会出错
    
    with open() as file 不需要 加 file.close()
    空格是指一行中有除了空格还有其余的字符,空行是指这行除了换行符没有其他的操作符,而文件的结束符都是空。

    这些区别也成为了文件处理他们的关键,

    判断空行是用‘ ’,判断结束符是用‘’(python代表空),判断空格是用‘ ’。

    判断空行:
    f = file.readlines()
    #读取文本所有内容,并且以列表的格式返回结果
    
    
    for i in f:
    if i == ' ':
    i = i.strip(' ')

     6.1、file.seek()语法

    1.作用:用于移动文件读写指针到指定位置
    
    2.语法:file.seek(offset,whence=0)# 括号里面有两个参数whence默认为0
    
                  -->offset:偏移量,需要向前或向后移动的字节数,正往结束方向移动,负往开始方向移动。
    
                  -->whence:可选值,默认为0,这意味着绝对的文件定位,
    
                    1这意味着寻求相对于当前位置,
    
                    2表示相对于文件的末尾。

    x.tell()      #显示当前游标位置在文件开头

    x.seek(3)     #移动3个字节,whence没有设置默认为从文件开头开始

    x.seek(5,1)   #移动5个字节,1代表从当前位置开始

    seek(0),相当于 移动0个字节,whence 没有则默认为从文件开头开始

    seek(1) 从文件开头移动1个字节,whence没有默认为0,即从文件开头位置

     7、修改文件 占硬盘和占内存

     修改文件
    
    占硬盘
    一个文件读取,一个文件写,完成后把替换旧的文件名   把修改后的数据写到另一个文件里面
    例子1:
    file = open('test.txt','r',encoding='utf-8')
    new_file = open('new_test.txt','w',encoding='utf-8')
    print(file.read())
    for line in file:
    if 'Alex' in line:
    line = line.replace('Alex','lele')
    if line == ' ':
    line = line.strip(' ') #删除 原文件中的 空行

    # 这样存入新文件原有不同行的数据都会在同一行显示
    #line = line.strip() #(移除默认为空格或换行符)每一行
    new_file.write(line)
    file.close()
    new_file.close()
    
    
    # 如果想把原文件 读取出来修改后生成的新文件 (原文件的内容没有发生变化)
    # 此时想把新文件替换掉就的原文件 ,

    用重命名的方法

    import os #写在开头

    os.replace(new_file,file) #写在结尾 #把新文件名字改成原文件 的名字,就把之前的覆盖掉了
    # ,windows使用os.replace # 帮助文档说明replace会覆盖原文件linux使用 os.rename
     

     

    ctrl+a 可以清晰,看覆盖多少行,可以直观看出总共11行,1行是空行!

    可以非常直观的看文件里面是否有空行

    # 占内存的方式修改 并更新文件
    data_list = []
    file = open('test.txt','r+',encoding='utf-8')
    f = file.readlines()
    print(len(f)) # 判断有多少行
    for line in f:
        if 'Alex' in line:
            line = line.replace('Alex','lele')#(old ,new)
        if line == '
    ':#删除文本中的空行
            line = line.strip('
    ')
        data_list.append(line)
    # 删除原文件的内容
    file.seek(0)
    file.truncate()
    for line in data_list:
        # 上一个for循环并没有删除每一行自带的换行符,所以写入时不需要加换行符
        file.write(line)
    file.close()
  • 相关阅读:
    WiFi QC 自动测试:ixChariot API初探
    WiFi QC 自动测试:Qt控制无线路由器
    树莓派实现只有一个按键的播放器(2)
    树莓派变身路由器
    树莓派实现一个下载机
    对于AP中为什么有4个WEP KEY的分析
    备份U盘分区表,未雨绸缪
    根文件系统理解
    kernel(一)编译体验
    kernel(二)源码浅析
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9487122.html
Copyright © 2020-2023  润新知