• python之文件处理


    文件处理流程

    1.打开文件,得到文件语句柄 并赋值给一个变量

    2.通过语句柄对文件进行操作

    3.关闭文件

    基本操作

    读操作

    fn=open('test.txt')
    data=fn.read()
    print (data)
    文件读操作,读出所有文件
    fn=open('test.txt')
    print(fn.readline())
    print(fn.readline())
    print(fn.readline())
    一行一行的读文件。PS:print会自动换行,解决方法
    print(fn.readline().strip('
    '))
    print(fn.readline().strip('
    '))
    print(fn.readline().strip('
    '))
    fn=open('test.txt')
    print (fn.readable())
    判断文件是否可读
    fn=open('test.txt')
    print (fn.readlines())
    将文件以列表的方式读出

    注意:读一行,光标向下移动一行。如果上面的操作读三行,那么再以readlines的方式查看就不会是所有的行都以列表的方式读出

    fn=open('test.txt')
    print(fn.readline().strip('
    '))
    print(fn.readline().strip('
    '))
    print (fn.readlines())
    
    
    111111111111111111111111111
    2222222222222222222222
    ['333333333333333333333333
    ', '4444444444444444444
    ', '555555555555555555
    ', '666666666666666
    ']
    fn=open('test.txt')
    for  line in fn.readlines():
        print (line).strip('
    ')
    循环文件,效率不高
    fn=open('test.txt')
    for line in fn:
        print (line).strip('
    ')
    使用这种方法循环文件,则没问题。这是一个非常厉害的功能(迭代器),后续的文章会介绍

    注意:每次在操作完文件后都要进行一次fn.close(文件关闭操作)。如果不关闭,则很会占用内存,一定要及时释放掉

    上下文管理操作

    with open('test.txt') as fn:
        print (fn.readlines())
    打开文件操作后无需关闭

    写操作

    在上面的例子中fn=open('test.txt')其实是可以在后面跟参数,写操作后面需要跟上'w',而读操作则不需要写,默认就是读操作.例子读fn=open('test.txt','r')

    写fn=open('test.txt','w')

    fn=open('test.txt','w')
    写操作,如果有这个文件,会将原来的文件进行覆盖。没有这个文件则创建
    fn=open('test2.txt','r')  
    读操作,如果有这个文件,则可以读。没有这个文件则报错。
    fn=open('test1.txt','w')
    print (fn.writeable())
    判断文件是否可写
    fn=open('test1.txt','w')
    print(fn.write('111
    '))
    print(fn.write('222 333 ')) 写文件,并返回写入几个字符
    fn=open('test1.txt','w')
    fn.writelines(['1111
    ','aaaa
    ','bbbb
    '])
    fn.close()

    注意,每次在操作文件结束后都要关闭文件哦!

     测试

     模仿vim更改文件内容

    hello aaa
    hello bbb
    hello ccc
    hello ddd
    old文件
    import os                                     #导入os模块为下面改名做准备
    old_fn=open('old','r')                         #读取源文件old
    new_fn=open('new','w')                         #打开新文件
    for old_line in old_fn:                       #将文件中的行遍历出来
        if old_line == 'hello aaa
    ':             #匹配要修改的行
            new_fn.write('hello 111
    ')           #将修改的文件写入新文件
            continue                             #想要修改的行结束后,跳过循环
        new_fn.write(old_line)                    #将不需要修改的文件写入新文件
    old_fn.close()                                #关闭文件
    new_fn.close()
    
    os.rename('old','.old.swp')                    #使用os模块将源文件改名
    os.rename('new','old')                         #将新文件改为源文件名
    使用上下文的方式来打开文件与关闭文件,就可以省略close的步骤
    import
    os with open('old','r') as old_fn: with open('new','w') as new_fn: for old_line in old_fn: if old_line == 'hello aaa ': new_fn.write('111 ') continue new_fn.write(old_line) os.rename('old','.old.swp') os.rename('new','old')

    注意:没有直接对硬盘文件修改那么一说。所有的文件修改都是将源文件从硬盘中读取到内存中,然后使用软件进行修改,将修改后的文件在刷回硬盘,覆盖源文件。切记!!!

    文件处理高级操作

    with open('a.txt','wb') as f:  #wb是打开一个文件以二进制形式写文件
        f.write('asdasdsa')
    
    #上面输出会报错
    
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled/day9/內建函数.py", line 18, in <module>
        f.write('asdasdsa')
    TypeError: a bytes-like object is required, not 'str'

    #格式不
    with open('a.txt','wb') as f:
        f.write(bytes('asdsdasd',encoding='utf-8'))
    #需要将文件的格式改变成bytes才能写入

     这样的好处是可以跨平台

    with open('a.txt','rb') as f:
        print(f.read())
    
    #如果想要通过rb查看文件,那么将会看到一堆二进制
    
    b'xe4xbdxa0xe5xa5xbdxe5x82xbbxe9x80xbcdasd'

     如果想要看到正常的文件,那么既然有编码就要用解码(用什么格式编码就用什么格式解码)

    with open('a.txt','rb') as f:
        print(f.read().decode(encoding='utf-8'))

    其他操作(并不常用)

    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
    
    打开文件的模式有:
    
    r ,只读模式  #默认模式,文件必须存在,不存在则抛出异常
    w,只写模式  #不可读;不存在则创建;存在则清空内容
    x, 只写模式  #不可读;不存在则创建,存在则报错
    a, 追加模式  #可读;   不存在则创建;存在则只追加内容
    "+" 表示可以同时读写某个文件
    
    r+, 读写 #可读,可写
    w+,写读 #可读,可写
    x+ ,写读 #可读,可写
    a+, 写读 #可读,可写
     "b"表示以字节的方式操作
    
    rb  或 r+b
    wb 或 w+b
    xb 或 w+b
    ab 或 a+b
     注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

     进度条

    #进度条
    import sys,time
    for i in range(10):     #循环输出10个#
        sys.stdout.write('#')   #sys.stdout跟print一样都是输出,只不过print是封装后输出
        sys.stdout.flush()  #sys.stdout.flush,将写入的文件刷出来,注意是不换行
        time.sleep(0.2)         #然后间隔0.2秒.一般来说这个间隔是看程序的运行或者启动时间来算的

     文件位置(seek)

    abc
    def
    ghi
    jkl
    mno
    测试代码
    with open('a.txt','r') as f:
        print(f.tell())             #查看当前光标位置
        print(f.read(2))            #读字符后面的数字是读取几个字符
        print(f.tell())             #读取之后光标就会移动
        f.seek(0)    #移动光标到0
        print('===================>')
        print(f.read())             #光标移动到0后,再次read会读出所有
        #seek移动光标需要参照物,默认情况下参照物为开头,实际上seek有两个参数
        print('===================>')
        f.seek(0)
        print(f.tell())
        f.seek(0,2)       #则代表参照开头移动一个光标,后面的数据代表三种模式分别为0,1,2
        print(f.tell())
    常用操作1
    with open('a.txt','r+') as f:
        f.truncate(3)                   #truncate截断属于写文件用r+用w直接清空文件
    
    #常用的就r,a,w
  • 相关阅读:
    【实战】PHP如何使用 ElasticSearch 做搜索
    基于PHP使用influxdb搭建监控服务系统
    influxdb 2.*版本与1.*版本区别
    rabbitmq的数据持久化
    基于纯真本地数据库的 IP 地址查询 PHP 源码
    【面试系列】主键索引和唯一索引谁更快?
    如何设计微博点赞功能数据库?
    降低composer版本(亲测可行)
    Compiler vs Interpreter
    Adobe AE问题排查 After Effects
  • 原文地址:https://www.cnblogs.com/charles1ee/p/6394874.html
Copyright © 2020-2023  润新知