Python 操作文件

时间:2022-06-19 15:38:44

open() 函数

模式 说明
r 只读模式
w 只写模式,文件不存在自动创建;存在则清空再写
a 只追加写,在文件最后追加写
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于写读,若文件已存在则将其清空,若该文件不存在,创建新文件。
a+ 打开一个文件用于读写。若文件已存在,文件指针将会在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

这里我们操作的文件

mytest 内容为:

1111111111111
2222222222222
3333333333333

readline 函数

f = open('mytest', 'r', encoding="utf8")  # 以读模式打开
print(f.readline()) # 读一行内容
print(f.readline())
print(f.readline())
print(f.readline())
f.close() # 关闭文件

运行结果:

Python 操作文件

注意:

readline 函数会返回一行文件内容,因为 print 函数会换行,而文本中每行有 \n 这个换行符,所以每行内容之间会多了一个空白行。


readlines 函数

f = open('mytest', 'r', encoding="utf8")
print(f.readlines()) # 读取所有内容,以列表形式返回
f.close()

运行结果:

Python 操作文件

f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
print(i.strip()) # 通过 strip 函数除去每行后面的 \n 换行符
f.close()

运行结果:

Python 操作文件


需求:在文件第二行末尾加入 'klvchen'

number = 0
f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
number += 1
if number == 2:
print(i.strip()+'klvchen')
else:
print(i.strip())
f.close()

运行结果:

Python 操作文件

优化版本(一):

number = 0
f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
number += 1
if number == 2:
i = "".join([i.strip(), 'klvchen'])
print(i.strip())
f.close()

运行结果:

Python 操作文件

优化版本(二):

number = 0
f = open('mytest', 'r', encoding="utf8")
for i in f: # for内部将 f 对象做成一个迭代器,用一行取一行,避免占用过多内存
number += 1
if number == 2:
i = "".join([i.strip(), 'klvchen'])
print(i.strip())
f.close()

运行结果:

Python 操作文件


tell() 函数

作用:返回文件的当前位置,即文件指针当前位置。

f = open('mytest', 'r', encoding='utf8')
print(f.tell())
print(f.read(10))
print(f.tell())
f.close()

运行结果:

Python 操作文件


seek() 函数

作用: 移动文件读取指针到指定位置。

f = open('mytest', 'r', encoding='utf8')
print(f.tell())
print(f.read(10))
print(f.tell())
f.seek(0)
print(f.tell())
print(f.read(10))
f.close()

运行结果:

Python 操作文件


flush() 函数

作用: 刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。

一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

import sys, time
for i in range(30):
sys.stdout.write("*")
sys.stdout.flush()
time.sleep(0.1)

运行结果:

Python 操作文件

注意:这是个进度条的展示

类似的实现可以使用下面代码:

import time
for i in range(30):
print("*", end='', flush=True) # print 函数也可以设置 flush 参数
time.sleep(0.1)

在文件第二行后面添加内容

f_read = open('mytest', 'r', encoding='utf-8')
f_write = open('mytest2', 'w', encoding='utf-8')
number = 0
for line in f_read:
number += 1
if number == 2:
line = ''.join([line.strip(), ' hello \n'])
f_write.write(line) f_write.close()
f_read.close()

运行结果:

Python 操作文件

使用另外一种方法打开文件,open 不需要自己调用 close()方法关闭

number = 0
with open('mytest', 'r') as f_read, open('mytest2', 'w') as f_write:
for line in f_read:
number += 1
if number == 2:
line = ''.join([line.strip(), ' hello \n'])
f_write.write(line)

运行结果:

Python 操作文件