文件操作
打开、操作、关闭
#最笨的办法打开文件,没有什么实际的用处
data = open("demo_file", encoding="utf-8").read()
#打开一个文件时需要指定一个编码集
print(data)
#使用文件句柄
f = open("demo_file", encoding="utf-8")
data = f.read()
print(data)
#不能实现文件的第二次读取,因为读一次类似于指针的东西已经到达了文件尾
需要添加模式,r表示读模式,w表示写模式,且读的模式下只能读,写的模式下只能写,这里的写是重新创建一个文件。若文件名不变会导致原有数据被覆盖,从删库到跑路。
#使用文件句柄
f = open("demo_file", 'w', encoding="utf-8")
f.write("这是覆盖文件后的操作\n")
f.write("接着上一句")
可见刚才的文件已经被重写了
#既想不覆盖原文件又想写那么需要换种模式,a=append追加
#但是a模式下同样也不能读
f = open("demo_file", 'a', encoding="utf-8")
f.write("这是追加文件后的操作\n")
f.write("追加又一句")
#通常是需要写文件关闭的,但是不写也不会报错,程序自动关闭
f.close()
#读文件指定行
f = open("demo_file", 'r', encoding="utf-8")
#读一行
print(f.readline())
#读五行
for i in range(5):
print(f.readline())
#读指定行可以采用判断的方法
#文件循环打印
f = open("demo_file", 'r', encoding="utf-8")
#readlines的返回是一个列表,元素是每行的内容加上换行符
#不去换行符如下
for line in f.readlines():
print(line)
# 去掉换行符变得更紧凑
for line in f.readlines():
print(line.strip())
补充:
#打到第九行不打了
for index, line in enumerate(f.readlines()):
if index == 9:
print('--------分割线---------')
continue
print(line.strip())
readlines这个函数将文件内容一次性读到内存中,若是文件过大则不够现实且耗费时间过长,采取其他办法,读一行内存释放一行这种
count = 0
for line in f:
if count == 9:
print('--------分割线---------')
continue
print(line)
count += 1
换用该方式后文件内容已经不再是列表,而变成了迭代器(之后解释),所以要自行设置计数器才能实现对打印行数的控制
f = open("demo_file", 'r', encoding="utf-8")
print(f.tell()) # 打印文件开始的位置
print(f.readline()) # 打印一行
print(f.tell()) # 记录当前位置
中间有一空行可能占了部分字符
f = open("demo_file", 'r', encoding="utf-8")
print(f.tell()) # 打印文件开始的位置
print(f.read(5)) # 打印五个字符
print(f.tell()) # 记录当前位置
f = open("demo_file", 'r', encoding="utf-8")
print(f.tell()) # 打印文件开始的位置
print(f.read(5)) # 打印五个字符
print(f.tell()) # 记录当前位置
print(f.seek(0)) # 回到文件开头了
print(f.readline())
print(f.encoding) # 显示文件编码格式
print(f.fileno()) # 操作系统调用文件的接口编号
print(f.flush()) # 将数据实时地从缓冲区写到硬盘
使用flush制作进度条:
import sys, time
for i in range(20):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
这里井号是一个个打出来的
对于文件的操作模式,还有'r+',即读写模式;'w+',即写读模式;'a+',即追加读写模式。其中用的最多的是读写模式。
'rb'二进制格式,文件以二进制编码,这种模式不能读encoding格式。在网络传输(socket)时常使用这种模式。
对文件进行改写并创建新文件
f = open("demo_file", 'r', encoding="utf-8")
f_new = open("demo_file.bak", "w", encoding="utf-8")
for line in f:
if "第二行" in line:
line = line.replace("第二行", "第若干行", 1)
f_new.write(line)
f.close()
f_new.close()
#读文件的另一种方法,完了无需关闭
with open("demo_file", 'r', encoding="utf-8") as f:
for line in f:
print(line)
python书写规范有时规定一行最好不超过80个字符,with实现多个文件同时打开的时候为了看得清楚,常使用如下格式:
with open("demo_file", "r", encoding="utf-8") as f ,\
open("demo_file2","r", encoding="utf-8") as f2: