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() # 关闭文件
运行结果:
注意:
readline 函数会返回一行文件内容,因为 print 函数会换行,而文本中每行有 \n 这个换行符,所以每行内容之间会多了一个空白行。
readlines 函数
f = open('mytest', 'r', encoding="utf8")
print(f.readlines()) # 读取所有内容,以列表形式返回
f.close()
运行结果:
f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
print(i.strip()) # 通过 strip 函数除去每行后面的 \n 换行符
f.close()
运行结果:
需求:在文件第二行末尾加入 '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()
运行结果:
优化版本(一):
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()
运行结果:
优化版本(二):
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()
运行结果:
tell() 函数
作用:返回文件的当前位置,即文件指针当前位置。
f = open('mytest', 'r', encoding='utf8')
print(f.tell())
print(f.read(10))
print(f.tell())
f.close()
运行结果:
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()
运行结果:
flush() 函数
作用: 刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
import sys, time
for i in range(30):
sys.stdout.write("*")
sys.stdout.flush()
time.sleep(0.1)
运行结果:
注意:这是个进度条的展示
类似的实现可以使用下面代码:
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()
运行结果:
使用另外一种方法打开文件,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)
运行结果: