Skip to content

Python 文件读写

985字约3分钟

Python

2022-07-26

文件读写

对磁盘文件的读写操作是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,因此读写文件就是请求操作系统打开一个文件对象,然后通过操作系统提供的接口从这个文件对象中读取数据或写入数据。

读文件

读取文本文件

以读文件的模式打开一个文件对象,使用Python内置的 open() 函数,传入文件名和标示符。

# 标示符 r 标识读
f = open('D:\Code\python27demo\zookeeper.txt', 'r')

如果文件不存在,open() 函数会抛出一个 IOERROR 的错误。

image-20230221135215361

如果文件打开成功,调用 read() 方法可以一次性读取文件的全部内容。

f = open('D:\Code\python27demo\zookeeper.txt', 'r')
file_detail = f.read()
print file_detail

image-20230221135420804

读取文件操作结束后,需要调用 close() 方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

f = open('D:\Code\python27demo\zookeeper.txt', 'r')
file_detail = f.read()
print file_detail
f.close()

读写文件的过程中有可能产生 IOERROR ,一旦出错,后面的 close() 操作就不会被执行。因此,为了保证无论是否报错都需要在结束的时候调用 close() 操作关闭文件,可以使用 try...finally 来实现:

try:
    f = open('D:\Code\python27demo\zookeeper.txt', 'r')
    print(f.read())
finally:
    if f:
        f.close()

Python 引入 with 语句也能够达到在文件操作结束后调用 close() 函数的目的:

with open('D:\Code\python27demo\zookeeper.txt', 'r') as f:
    print(f.read())

调用 read() 会一次性读取文件的全部内容,如果文件过大,可能会导致系统资源过载,从而导致函数执行异常,因此可以通过反复掉用 read(size), 读取 size 字节的内容:

f = open('D:\Code\python27demo\zookeeper.txt', 'r')
file_detail = f.read(8)
file_detail2 = f.read(8)
print file_detail
print '--------'
print file_detail2
f.close()

image-20230221140441920

除指定 size 的方式以外,还可通过 readline()readlines() 的方法,readline() 可以每次读取一行内容,readlines()一次读取所有内容并按行返回一个list

with open('D:\Code\python27demo\zookeeper.txt', 'r') as f:
    file_line = f.readline()
    file_lines = f.readlines()

print file_line
print file_lines

image-20230221140910321

读取二进制文件

如图片、视频等都是二进制文件,使用 rb 标示符进行读取操作。

with open('D:\Code\python27demo\\auther.jpg', 'rb') as f:
    file = f.read()

文件编码

如果要读取非 UTF-8 编码格式的文本文件,需要给 open()函数传入 encoding 参数,例如,读取 GBK 编码的文件:

# python2
import io
with io.open('D:\Code\python27demo\zookeeper.txt', 'r',encoding='gbk') as f:
    file = f.read()
print file

# python3
with open('D:\Code\python27demo\zookeeper.txt', 'r', encoding='gbk') as f:
    file = f.read()
print(file)

image-20230221142847149

写文件

覆盖操作

写文件和读文件操作是一致的,唯一的区别是 open() 函数时,传入标识符 wwb 表示写文本文件或写二进制文件。

with open('D:\Code\python27demo\zookeeper.txt', 'w') as f:
    f.write('192.168.110.30')

with open('D:\Code\python27demo\zookeeper.txt', 'r') as f:
    file = f.read()
    print file

image-20230221143324393

追加操作

w 模式写入文件时,如果文件中存在其他内容,会直接进行覆盖,如果希望追加文件到末尾,可以通过a 模式,进行追加写入操作。

with open('D:\Code\python27demo\zookeeper.txt', 'r') as f:
    file = f.read()
    print file
    
with open('D:\Code\python27demo\zookeeper.txt', 'a') as f:
    f.write('192.168.110.30\n')

with open('D:\Code\python27demo\zookeeper.txt', 'r') as f:
    file = f.read()
    print file

image-20230221143810824