zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/smallmars/p/6936846.html
Copyright © 2011-2022 走看看