• Python开发【第六篇】:文件处理


    1. 文件

      文件处理流程:

    • 打开文件,获得文件句柄,并赋值
    • 通过句柄对文件进行操作
    • 关闭文件

    1.1 打开文件

      在 Python 中使用 open()函数打开文件,并返回文件对象:

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    

      open 函数有很多参数,一般地只需了解三个即可。第一个是文件对象,第二个是打开模式,第四个是编码方式

    Tips:open 函数打开文件采用的默认编码方式是系统编码,Windows 为 GBK;若打开的文件是 utf-8,那么需要指定编码方式为 utf-8,否则乱码。

    文件打开模式
    打开模式 说明
    r 只读方式打开(默认)
    x 如果文件存在,打开引发异常
    b 以二进制方式打开文件
    + 可读写模式(可添加到其他模式中)
    w 只写方式打开,会覆盖已存在文件
    a 以写入模式打开,文件存在,在末尾追加
    t 以文本模式打开(默认)
    U 通用换行符支持

      使用 open 函数打开一个文件,可以获得文件对象(或句柄),利用文件对象,我们就可以对文件进行读取或 修改操作:

    f = open('C:\Users\HJ\Desktop\a.txt')
    

    Tips:open 函数默认以只读模式打开文本文件,即 rt 模式,打开二进制需要 b 模式。

    1.1.1 文件对象方法

      打开文件后获得文件对象,利用文件对象的一些方法,我们可以对文件内容进行读取或修改。

    文件对象方法
    文件对象方法 说明
    read([n]) 读取文件(全部读取),以自己为单位读取
    readable() 判断文件是否可读,返回布尔值
    readline() 一次读取一行,默认换行,f.readline(),end=''不换行
    readlines() 读取所有内容,存成列表
    write(str) 将字符串写入文件
    writeable() 判断文件是否可写
    writelines(seq) 写入一个序列,元素必须是字符串
    seek(offset,from) 在文件中移动文件指针
    tell() 返回当前在文件中的位置
    close() 关闭文件

    1.1.2 with 关键字

      使用 open 函数打开文件,每次都需要关闭文件,很是麻烦。一旦没有关闭,文件就会有泄漏的风险。而 Python 为我们提供了一个关键字 with,不需要我们每次自己关闭文件,Python 内部会自动关闭。

    with open('a.txt') as f:		# f 即为文件对象
    	f.read()	
    

      打开一个文件,并将内容写入另一个文件中:

    with open('a.txt', 'r', encoding='utf-8') as f1,
    	 open('b.txt', 'w', encoding='utf-8') as f2:
            data = f1.readlines()	# 存为列表
            f2.write(data[0])		# 只写入第一行
    

    1.1.3 文件定位

      tell()方法

      read 方法以 字节读取文件,不指定参数,默认全部读取,文件指针指向文件末尾。使用 tell 方法可以查看文件指针位置。

    # test_file.txt
    第一行
    第二行
    
    f = open('test_file',  encoding='utf-8', newline='')
    data = f.readlines()
    print(f.tell())
    print(data)
    f.close()
    
    22
    ['第一行
    ', '第二行
    ']
    

      文件默认不显示 ,每个汉字 3 个字节,总共 6 个汉字(即 18 个字节)。再加上两个 (即 4 个字节),总计 22 个字节,显然文件指针已经指向文件末尾。

    Tips:在不同系统中换行符不同,Windows 中为 ,Linux 中为 。Python 为了更好地兼容其他平台,统一转换为 ,要想查看真实的换行符,可在 open 函数中指定 newline = ''

      默认不显示换行符:

    f = open('test_file',  encoding='utf-8')
    print(f.read())
    print(f.tell())
    
    第一行
    第二行
    22
    

      使用 readlines()只能看到

    f = open('test_file',  encoding='utf-8')
    print(f.readlines())
    print(f.tell)	
    
    ['第一行
    ', '第二行
    ']
    22
    

      seek()方法

      文件指针即用来定位光标所在,相当于一个书签,seek()方法可以用来设置文件指针的位置,它的单位也是 字节

    seek(offset, from)
    seek(3)		# 移动 3 个字节
    

      seek()有两个参数:第一个 offset 为偏移量(即偏移字节),第二个 from 表示从哪个位置开始偏移,from 为三种模式:

    • 0:表示从文件开头位置偏移
    • 1:表示从当前位置偏移,必须以 rb 模式打开,最后再解码
    • 2:表示从文件末尾开始偏移,必须以 rb 模式打开,最后再解码

      从文件开始位置偏移:

    f = open('test_file',  encoding='utf-8')
    print(f.tell())			# 文件刚打开时位置为 0
    f.seek(10, 0)			# 偏移 10 个字节,即第一行 
     的后面,那么剩下的还要 
     和 第二行内容
    print(f.tell())			
    print(f.read())
    f.close()
    
    0
    10
    
    第二行
    

      从当前位置偏移:

    f = open('test_file', 'rb')
    f.seek(3, 0)		# 移动 3 个字节
    print(f.tell()) 	 # 3 位置
    f.seek(3, 1)			# 在 3 位置,再移动 3 个字节
    print(f.tell())
    print(f.read().decode('utf-8'))
    f.close()
    
    3
    6
    行
    第二行
    

      首先移动 3 个字节,再移动 3 个字节,指针到了第一行内容(第一行)中一的后面,再读取后面的内容。

      文件末尾偏移:

    f = open('test_file', 'rb')
    f.seek(-5, 2)
    print(f.tell())
    data = f.readlines()
    print(data)
    print(data[-1].decode('utf-8'))
    f.close()
    
    17
    [b'xe8xa1x8c
    ']		# 二进制,需要解码
    行
    

      访问文件的两种方式

      设置一个查看日志的程序(查看日志一般都是查看最新的,即文件最后位置的内容)。

      方法一:

      使用 readlines()方法查看,缺点是需要全部将文件读取出来,加载到内存才能读取最后一行,消耗时间和内存。

    f = open('a.txt', encoding='utf-8')
    data = f.readlines()
    print(data[-1])
    

      方法二:

      利用 seek()方法,将文件指针移动到文件末尾,从文件末尾开始读取。

    f = open('a.txt', 'rb')
    for i in f:
        offs = -10
        while True:
            f.seek(offs, 2)
            data = f.readlines()
            if len(data) > 1:			# 大于 1 表示读了两行
                print('文件最后一行是:%s' % (data[-1]).decode('utf-8'))
                break
            offs *= 2		# 小于 1 表示没有最后一行没有读完,再将偏移量翻倍
    

    1.2 文件写入

      写入文件必须是 w 或 a 模式打开文件,只能写入字符串,不能写入其他数据类型。

    1.2.1 w、a 模式

      w 模式打开文件,文件存在则覆盖原有内容,文件不存在则新建。a 模式打开文件,文件追加到文件末尾:

    f = open('a.txt', 'w', encoding='utf-8')
    f.write('123
    ')		# 要加换行
    f.writelines(['45
    ', '67
    '])		# 写入一个列表
    

    1.2.2 + 模式

      +表示同时可以对文件进行读写操作。

    模式 说明 模式 说明
    r+ 读写 w+ 读写
    x+ 写读 a+ 写读

    1.2.3 b 模式

      b 模式以字节为单位打开文件,即可打开二进制文件(包括视频、图片、音频等),打开时不能指定编码方式。

      一个文件在未保存时,它是存在于内存中(字符串形式)。当要存储到硬盘上时,便需要编码成字节码(bytes),同理硬盘上的内容加载处理,需要解码(decode)成字符串(str):

    # a.txt
    第一行
    
    f = open('test_file', 'rb')
    data = f.read()
    print(data)
    print(data.decode('utf-8'))
    
    b'xe7xacxacxe4xb8x80xe8xa1x8c
    
    '
    第一行
    

      wb 、ab模式

      以二进制格式写入文件,会覆盖原文件。只能写入二进制文件,因此写入的字符串必须编码成二进制。

    f = open('a.txt', 'wb')
    f.write(bytes('你好
    ', encoding='utf-8'))
    #f.write('你好
    '。encode('utf-8'))
    

      以上两种方式都可以写入文件,ab 末尾则是在末尾追加。

    1.2.4 其他文件对象方法

    f.closed():判断文件是否关闭
    f.encoding:查看文件打开的编码
    f.flush():刷新(每过几秒自动保存)从内存到硬盘
    

    1.3 总结

      open 函数打开文件六种模式r、r+、w、w+、a、a+的区别:

    • r:只读
    • r+:可读写,直接写入文件,则从文件开头开始写,覆盖原有内容。若先读后写则在文件末尾追加。
    • w:只写,覆盖文件内容,文件不存在则新建
    • w+:可读写,如果文件存在,则覆盖整个文件内容。不存在则新建。
    • a:只写,从文件末尾追加内容,文件不存在则新建
    • a+:可读写,从文件开头读取内容,从文件末尾添加内容
  • 相关阅读:
    第一条博客
    (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义01--对象的含义01--属性和字段
    (原创)c#学习笔记06--函数06--委托
    (原创)c#学习笔记06--函数05--函数的重载
    (原创)c#学习笔记06--函数04--结构函数
    (原创)c#学习笔记06--函数03--main函数
    (原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据
    (原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
    (原创)c#学习笔记06--函数01--定义和使用函数02--参数
    (原创)c#学习笔记06--函数01--定义和使用函数01--返回值
  • 原文地址:https://www.cnblogs.com/midworld/p/10271228.html
Copyright © 2020-2023  润新知