zoukankan      html  css  js  c++  java
  • 9 文件处理

    文件处理

    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,可以将结果赋值给一个变量,这个变量我们称为句柄。这样我们就可以通过这个句柄对此文件进行操作。使用后关闭。

    # f=open('文件路径','打开方式',encoding='字符编码') #f为文件句柄
    # print('+++++>1',f.read()) #输出全部
    # print(type(data))
    # print('+++++>2',f.read()) #空
    # print('+++++>3',f.read()) #空
    # f.close()  #文件关闭
    # print(f)  #可用
    # f.read()  #不可用
    # del f  #仅删除f句柄

    回收资源

    1 f.close():一定要做,关闭操作系统打开的文件,即回收操作系统的资源
    2 del f:没必要做,因为在python程序运行完毕后,会自动清理与该程序有关的所有内存空间

    文件打开模式

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @Version : 1.0
    # @Time    : 2017/09/06 
    # @Author  : tony
    # @File    : File operation  
    
    
    
    ####################### File operation read ...  ############################
    
    
    # with 有自动closed文件到功能... 也可同时打开多个文件    
    #with open('a.txt','r')as f1,open('b.txt','r')as f2, open('c.txt','r')as f3 :
    
    #with open('config.txt','r',encoding='utf-8') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
                                # windows 平台要加上encoding='utf-8'
    with open('config.txt','r') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
    
        ff = f.read()     # r.read()  是将文件全部读取到内存....大文件不能用次方法,内存受不了...
        print(ff)
    
        '''
        执行结果:
    
    11111111111111111111111111111111
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    cccccccccccccccccccccccccccccccc
    dddddddddddddddddddddddddddddddd
    99999999999999999999999999999999
        '''
    
    
    
    #with open('config.txt','r',encoding='utf-8') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
                                # windows 平台要加上encoding='utf-8'
    with open('config.txt','r') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
        ff = f.readline()     # r.readline()  每次执行只读一行...... 可以循环读取整个文件.....
        print(ff)
    
        '''
        执行结果:
    11111111111111111111111111111111
        '''
    
    
    
    #with open('config.txt','r',encoding='utf-8') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
                                # windows 平台要加上encoding='utf-8'
    with open('config.txt','r') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
    
        for line in f:      # 循环每一行,
            print(line.strip())   # strip()去掉每一行后面到换行符
    
    
        '''
        执行结果:
    11111111111111111111111111111111
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    22222222222222222222222222222222
    33333333333333333333333333333333
    99999999999999999999999999999999
        '''
    
    
    
    #with open('config.txt','r',encoding='utf-8') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
                                # windows 平台要加上encoding='utf-8'
    with open('config.txt','r') as f:  # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error..
        ff = f.readlines()     # r.readlines()   读取文件所有行,返回一个list..
        print(ff)
    
    
        '''
        执行结果:
        ['11111111111111111111111111111111
    ', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    ',
        '22222222222222222222222222222222
    ', '33333333333333333333333333333333
    ',
        'cccccccccccccccccccccccccccccccc
    ', 'dddddddddddddddddddddddddddddddd
    ',
        '99999999999999999999999999999999
    ', '
    ']
    
        '''
    
    with open('a.txt','a') as f:  # 参数 a 表示追加模式..文件存在追加,不存在touch_file..
    
        f.write('在文件到末尾追加内容...
    ')     # r.readlines()   读取文件所有行,返回一个list..
        print(ff)
    
    
        '''
        执行两次的结果:
        在文件到末尾追加内容...
        在文件到末尾追加内容...
    
        '''
    
    
    ####################### File operation read ...  ############################
    
    
    
    with open('b.txt','w') as f:       # w 参数是写到模式,文件不存在会创建文件,文件存在会清空重写...
    
        f.write('这里直接写字符串,并且最后加换行符
    ')      #  写一行字符串到文件里面 
        f.write('这里直接写字符串,并且最后加换行符
    ')      #  写一行字符串到文件里面 
        f.write('这里直接写字符串,并且最后加换行符
    ')
    
    
    
    
    
    with open('c.txt','w') as f:       # w 参数是写到模式,文件不存在会创建文件,文件存在会清空重写...
        # 多行写入文件,list 包起来 only list
        f.writelines(['writelines用list可以多行写入文件
    ','writelines用list可以多行写入文件
    ',])
        f.writelines(['writelines用list可以多行写入文件
    ','writelines用list可以多行写入文件
    ',])
    
    '''
        r 只能读
        r+ 可读可写 不会创建不存在的文件 从顶部开始写 会覆盖之前此位置的内容
        w+ 可读可写 如果文件存在 则覆盖整个文件不存在则创建
        w 只能写 覆盖整个文件 不存在则创建
        a 只能写 从文件底部添加内容 不存在则创建
        a+ 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建
    '''
    
    
    ####################################  rb 模式 ############################################
    
    with open('a.txt','rb') as f: # rb 模式 是按 字节读...bytes   汉字占三个bytes ,
                                    #  so rb 模式下时读中文 要是3的倍数.... 然后再decode utf-8
    
        ff = f.read()
        print(ff)
        '''
        b'xe5x9cxa8xe6x96x87xe4xbbxb6xe5x88xb0
    '
        '''
        print(ff.decode('utf-8'))  # 解码UTF-8 后
    
        '''正常显示中文..'''

    打开文件的模式有:

    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

    #文本文件:只读模式,文件不存在报错
    f=open('aaaa.py','r')
    print(f.read())  #读所有
    print(f.readline(),end='')  #读行
    print(f.readlines())  #读所有将每行放到数组中
    print(f.readable())  #判断是否可读
    print(f.writable()) #False
    f.close()  #关闭

    w,只写模式【不可读;不存在则创建;存在则清空内容】

    #文本文件:只写模式,文件不存在则创建空文件,文件存在则清空
    f=open('new.txt','w')
    f.write('1111111
    ')  #写入
    f.writelines(['22222
    ','3333
    ','444444
    '])  #写入三行
    print(f.writable())  #判断是否可写入
    f.close() 

    a, 追加模式【可读;   不存在则创建;存在则只追加内容】

    #文本文件:只追加写模式,文件不存在则创建,文件存在可追加内容
    # f=open('new_2','a',encoding='utf-8')
    # print(f.readable())  #False
    # print(f.writable())  #True
    
    # f.write('33333
    ')
    # f.write('44444
    ')
    # f.writelines(['5555
    ','6666
    '])
    
    # f.close()

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

    r+, 读写【可读,可写】

    #可写可读  打开文件的时候文件就为空,写的是任意内容,读的是刚刚写进去的内容
    #要想读,先移动光标
    #读的光标和写的光标是两回事
    f = open('复习.py','w+',encoding='utf-8')
    f.write('12237yuiayi')
    #seek 制定光标的位置在0位置
    f.seek(0)
    print(f.read(3))
    f.write('kahkshldkhd')
    print('***',f.read())
    f.close()

    w+,写读【可读,可写】

    #可读可写
    f = open('复习.py','r+',encoding='utf-8')
    print(f.read())
    f.write('
    ajshdjkdjk')
    f.close() 

    a+, 写读【可读,可写】

    #追加可读
    f = open('复习2.py','a+',encoding='utf-8')
    f.seek(0)
    print(f.read())

     "b"表示以字节的方式操作

    #rb
    f=open('aaaa.py','rb')
    print(f.read().decode('utf-8'))
    
    f=open('1.jpg','rb')
    data=f.read() 

    wb

    #wb
    f=open('2.jpg','wb')
    f.write(data)
    f=open('new_3.txt','wb')
    f.write('aaaaa
    '.encode('utf-8'))

    ab

    #ab
    f=open('new_3.txt','ab')
    f.write('aaaaa
    '.encode('utf-8'))

    此方式的操作可以对一些非字节文件做操作比如说图片,视频等任意文件。

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @Author  : tony
    # @Version : 1.0
    # @Time    : 2017/09/06 
    # @File    : cp _File  
    
    
    
    import time
    import sys  # sys这个包括包含针对系统操作的一些api.
    sys.argv   # sys.argv,获取执行脚本的参数返回一个list ,第一个参数是
                            # 脚本本身...
    
    if len(sys.argv) <3 :
        print('Usage:python3 copy.py source.file target.file')
        sys.exit
    
    
    
    ############ 通过文件操作 rb 模式 模仿一个cp 命令 ..... 拷贝×格式到文件都行...
    
    # linux 下 当前path 下.... 
    
    print('start copy file {0}.....'.format(time.ctime()))
    
    # with 同时打开两个文件,一个读一个写.... 
    
    with open(sys.argv[1],'rb') as f_read, 
            open(sys.argv[2],'wb') as f_wirte:
        for line in f_read:     # 循环读取原文件的每一行
            f_wirte.write(line)   # 一行一行写入新文件
    
    
    print('End copy file {0}.....'.format(time.ctime()))
    
    
    
    
    '''
    
    # Windows 下 当前path 下....
    
    print('start copy file {0}.....'.format(time.ctime()))
    
    # with 同时打开两个文件,一个读一个写....
    #r'C:UsersAdministratorPycharmProjectspython周末班day3	est.jpg'
    with open(r'%s'%sys.argv[1],'rb') as f_read, 
            open(r'%s'%sys.argv[2],'wb') as f_wirte:
        for line in f_read:     # 循环读取原文件的每一行
            f_wirte.write(line)   # 一行一行写入新文件
    
    '''

    文件的光标移动

    read(3):

     

    1. 文件打开方式为文本模式时,代表读取3个字符

     

    2. 文件打开方式为b模式时,代表读取3个字节

     

    用只读方式和只写方式打开文件光标都在首,追写方式打开在尾。想要自己移动光标只能借助seek(光标位置)方法实现

     

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @Version : 1.0
    # @Time    : 2017/03/20 
    # @Author  : tony
    # @File    : seek.py
    
    import sys
    import time
    
    
    
    ########      r      读取文件是按字符读取  ######## 
    
    def seek_r():
    
        with open('seekconfig.txt','r',encoding='utf-8') as f:  # 按字符读取,encoding='utf-8'
    
            print(f.tell())    # tall 返回文件内的光所在的当前位置.....
    
            ''' 打印结果是 0,说明光标在文件头..'''
    
            print(f.read())   # 读取全部内容到内存,read()可以有参数的
    
            '''打印结果:这个演示文件操作内光标的移动
            这个演示文件操作内光标的移动
            这个演示文件操作内光标的移动'''
            print(f.tell())    # tall 返回文件内的光所在的当前位置.....
    
            ''' 打印结果是 129,说明光标在文件last,也即读完了..'''
    
            print(f.read(1))  # 读取一个字符 == 一个汉字  'r'模式
    
            '''打印结果:这 '''
    
        #  seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
    
            f.seek(3,0)  # seek 按字节移动,一个汉字 == 3 个字节
            print(f.read(1))   # 读取一个字符 == 一个汉字  'r'模式
    
            '''打印结果:个 '''
            print(f.tell())    # tall 返回文件内的光所在的当前位置按字节计算 .....
    
            ''' 打印结果是 6,说明光标在文件第二个字到位置.......'''
    
    
    
    
    
    ########      rb      读取文件是按字节  bytes 读取  ######## 
    
    
    
    def seek_rb():
    
        with open('seekconfig.txt','rb') as f:    # 按字节  bytes  读取,不需要encoding
    
            #print(f.tell())    # tall 返回文件内的光所在的当前位置.....
    
            ''' 打印结果是 0,说明光标在文件头..'''
    
            #print(f.read().decode('utf-8'))   # 读取全部内容到内存,read()可以有参数的
                                                # rb 模式读取 需要解码 decode.. 
    
            '''打印结果:这个演示文件操作内光标的移动
            这个演示文件操作内光标的移动
            这个演示文件操作内光标的移动'''
    
            #print(f.read())  # 看一眼不编码的 字节 ... 
    
            '''b'xe8xbfx99xe4xb8xaaxe6xbcx94'''
    
    
            #print(f.tell())    # tall 返回文件内的光所在的当前位置.....
    
            ''' 打印结果是 129,说明光标在文件last,也即读完了..'''
    
            #print(f.read(3).decode('utf-8'))  # 按字节  bytes 读取 ,一个汉字占三个字节..
                                                # 需要解码就得是3的倍数...
    
            '''打印结果:这 '''
    
                 # seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
    
            #f.seek(3,0)  # seek 按字节移动,一个汉字 == 3 个字节 
                        # 0 是相对值,就是文件开头.. 1 是当前tall... 2 是 文件末尾...
            #print(f.read(3).decode('utf-8'))   # 读取下一个汉字 ...  
    
            '''打印结果:个 '''
    
            #print(f.tell())    # tall 返回文件内的光所在的当前位置按字节计算 .....
    
            ''' 打印结果是 6,说明光标在文件第二个字到位置.......'''
    
    
    
            f.seek(0,2)        # 将光标调至文件末尾去
            print(f.tell())    # 打印光标 last position 
    
    #######   模仿 tail -f 命令 ...  ################### 
    
    
    
    
    
    
    
    if __name__ == '__main__':
    
    #    seek_r()
        seek_rb()

    上下文管理

    #上下文管理
    with open('aaaa.py','r',encoding='utf-8') as read_f,
            open('aaaa_new.py','w',encoding='utf-8') as write_f:
    #一行太长可以用来将一行分成两行或多行但本质还是一行
        data=read_f.read()
        write_f.write(data)
    
    #不需要关闭(即不用close)此格式会自动关闭
    #with open() as 句柄,open() as 句柄 :   #可以一次打开多个
    #    对文件的操作

    循环每一行

    with open('a.txt','r',encoding='utf-8') as f:
        while True:
            line=f.readline()
            if not line:break
            print(line,end='')
    
        lines=f.readlines() #只适用于小文件
        print(lines)
    
        data=f.read()
        print(type(data))
    
    
        for line in f: #推荐使用
            print(line,end='')

    文件的修改

    #方式一:只适用于小文件
    import os  #导入os模块
    with open('a.txt','r',encoding='utf-8') as read_f,
            open('a.txt.swap','w',encoding='utf-8') as write_f:
        data=read_f.read()
        write_f.write(data.replace('alex_SB','alex_BSB'))
    
    os.remove('a.txt')  #移除
    os.rename('a.txt.swap','a.txt')  #重命名
    
    
    #方式二:
    import os
    with open('a.txt','r',encoding='utf-8') as read_f,
            open('a.txt.swap','w',encoding='utf-8') as write_f:
        for line in read_f:
            write_f.write(line.replace('alex_BSB','BB_alex_SB'))
    
    os.remove('a.txt')
    os.rename('a.txt.swap','a.txt')
    
    #OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。

    tail -f file.txt

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @Version : 1.0
    # @Time    : 2017/09/06 
    # @Author  : tony
    # @File    : tail -f  
    
    import sys
    import time
    
    
    
    
    def tail_f():
    
        with open(sys.argv[2],'rb') as f_read:          # seek(0,2)  必须用 rb 模式     
    
            f_read.seek(0,2)                            # 将内部光标调至文件末尾......
    
            while True:
                                                         # 一行行到读,去掉换行符
                ff = f_read.readline().strip()
    
                if len(ff) != 0:                        # 根据长度判断是否读到..... 
    
                    print(ff.decode('utf-8'))           # 有货就解码.
    
                    print(ff)                           # 打印不解码到看看.....
    
                else:                                   # 没有货 continue 
                    time.sleep(2)
                    continue
    
    
    
    
    
    
    
    
    
    
    if __name__ == '__main__':
    
        if len(sys.argv) < 3:                        # 需要两个参数 -f file_name  
            print('he second parameter requires a file')
            sys.exit                                # 参数不够... 提示 exit
    
    
    tail_f()
  • 相关阅读:
    五十:数据库之Flask-Script详解
    四十九:数据库之Flask-SQLAlchemy下alembic的配置
    四十八:数据库之alembic常用命令和经典错误的解决办法
    四十七:数据库之alembic数据库迁移工具的基本使用
    四十六:数据库之Flask-SQLAlchemy的使用
    四十五:数据库之SQLAlchemy之subquery实现复杂查询
    四十四:数据库之SQLAlchemy之join实现复杂查询
    四十三:数据库之SQLAlchemy之group_by和having子句
    四十二:数据库之SQLAlchemy之数据查询懒加载技术
    四十一:数据库之SQLAlchemy之limlt、、slice、offset及切片
  • 原文地址:https://www.cnblogs.com/liushubao/p/7484985.html
Copyright © 2011-2022 走看看