• 【python3之文件操作】


     一、文件操作

    1.文件处理的流程

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

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

    3)关闭文件

    例如:

    f = open('chenli.txt') #打开文件
    first_line = f.readline()
    print('first line:',first_line) #读一行
    data = f.read()# 读取剩下的所有内容,文件大时不要用
    print(data) #打印读取内容
    f.close() #关闭文件

    2.文件操作基本用法

    1)基本用法:

    file_object = open(file_name, access_mode = ‘r’, buffering = -1)

    open函数有很多的参数,常用的是file_name,mode和encoding

    file_name:打开的文件名,若非当前路径,需指出具体路径
    access_mode文件打开模式
    buffering的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
    encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk;
    
    

    2)文件打开模式

    • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    • w,只写模式【不可读;不存在则创建;存在则清空内容】
    • x, 只写模式【不可读;不存在则创建,存在则报错】
    • a, 追加模式【可读;   不存在则创建;存在则只追加内容】,文件指针自动移到文件尾。

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

    • r+, 读写【可读,可写】
    • w+,写读【可读,可写】,消除文件内容,然后以读写方式打开文件。
    • x+ ,写读【可读,可写】
    • a+, 写读【可读,可写】,以读写方式打开文件,并把文件指针移到文件尾。

     "b"表示以字节的方式操作,以二进制模式打开文件,而不是以文本模式。

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b

     注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    3)以读r的方式打开文件

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    f=open('1.txt',encoding='utf-8',mode='r')
    print(f)
    data1=f.read()
    print(data1)

    1.txt

    55542342
    123

    输出:

    <_io.TextIOWrapper name='1.txt' mode='r' encoding='utf-8'>
    55542342
    123

    补充:

    复制代码
    1)python中有三个方法来处理文件内容的读取:
    read() #一次读取全部的文件内容。
    
    readline() #每次读取文件的一行。
    
    readlines() #读取文件的所有行,返回一个字符串列表。
    
    2)print(f.readable())    #判断文件是否是r模式打开的
    
    3)print(f.closed)    #判断文件是否是关闭状态
    4)python中在文本文件内容移动的操作 file.seek(offset,whence=0) #从文件中给移动指针,从whence(0起始,1当前,2末尾)偏移offset个字节,正往结束方向移动,负往开始方向移动 file.tell()          #返回当前文件中的位置。获得文件指针位置
    5) file.truncate(size=file.tell()) #截取文件到最大size个字节,默认为当前文件位置
    复制代码

    4)以w方式写入文件

    复制代码
    f=open('a.txt','w',encoding='utf-8')
    # f=open('b.txt','r',encoding='utf-8') #以读的方式打开文件,文件不存在则报错
    f=open('b.txt','w',encoding='utf-8')
    # print(f.writable())
    
    f.write('111111
    22222222')
    f.seek(0)
    f.write('
    333333
    444444')
    
    f.writelines(['
    55555
    ','6666
    ','77777
    '])
    f.close()
    复制代码

    a.txt 为空

    b.txt

    333333
    444444
    55555
    6666
    77777

    补充:

    file.write(str)     #向文件中写入字符串(文本或二进制)
    file.writelines(seq)    #写入多行,向文件中写入一个字符串列表,注意,要自己加入每行的换行符
    file.flush()    #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入.

    5)文件修改

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import os
    read_f=open('b.txt','r')
    write_f=open('.b.txt.swap','w')
    for line in read_f.readlines():
        if line.startswith('1111'):
            line='2222222222
    '
        write_f.write(line)
    read_f.close()
    write_f.close()
    os.remove('b.txt')
    os.rename('.b.txt.swap','b.txt')
    复制代码

    3.上下文管理with语句

    当你做文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

    正常情况下,代码如下:

    file = open("/tmp/foo.txt")
    data = file.read()
    file.close()

    这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。

    然而with可以很好的处理上下文环境产生的异常。下面是with版本的代码:

    with open("/tmp /foo.txt") as file:
        data = file.read()

    with的基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。

    补充:

    模拟   tail -f access.log

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    # tail -f access.log
    import time
    with open('access.log','r',encoding='utf-8') as f:
        f.seek(0,2)
        while True:
            line=f.readline().strip()
            if line:
                print('新增一行日志',line)
            time.sleep(0.5)
    复制代码
  • 相关阅读:
    程序猿——踩bug之路
    原来python如此神奇
    结对编程——经验教训总结
    结对编程项目之队友个人项目优缺点
    结对编程:带ui设计的学生答题系统
    结对编程-自动出题项目代码分析
    记java的那些编辑器的故事之凌嘉文+李晓彤-结对编程
    结对编程-如何用精简的java代码写出这个系统
    数据库设计心得--知青村
    需求分析心得--住建执法项目小组知青村队
  • 原文地址:https://www.cnblogs.com/zhangyingai/p/7097957.html
Copyright © 2020-2023  润新知