对文件操作流程:
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件
创建一个名为lyrics的txt文件在目录下
f = open('lyrics','r',encoding="utf-8") #打开文件,f为文件句柄,r为读模式 first_line = f.readline() print("first line:",first_line) #读文件的第一行,文件太大时建议循坏方式读取内容 print('我是分割线'.center(50,'-')) #创建一条分割线 data = f.read() #读取完整的文件,文件太大时不要使用 print(data) #打印文件 f.close() #关闭文件
注意文件是utf-8保存的,打开文件时open函数通过操作系统打开文件,而我所在的win7操作系统默认使用gbk编码,因为不能直接打开,需要加上encoding="utf-8"
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则覆盖原来的内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;等同append】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读:从0位读取;可写:末端添加】
- w+,写读(没什么实际用处)
- a+,同a
"U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
循环读取文件:
readline 读取整行文字
readlines 读取所有行
读取打印n行数据
for i in range(n): print(f.readline)
读取打印整份文件:
只适合读小内存文件
for line in f.readlines(): #每循环一次(打印一行),line等于一个元素
print(line.strip()) #打印每行,strip()函数:去掉换行符和空格
读取到第九行插入“分割线”:
for index,line in enumerate(f.readlines()): if index == 9: print('我是分割线'.center(50,'-')) continue print(line.strip())
一行行读取文件,内存里面只保存一行文字
可适用大文件,效率更高!推荐!
for line in f: #f已经变成了一个迭代器 print(line)
读取到第九行插入“分割线”:
#自己添加计数器 count = 0 for line in f: if count == 9: print('我是分割线'.center(50, '-')) print(line) count += 1
文件修改:
两种方式
1.把文件全部加载到内存对象,像VIM一样,修改完后写到原文件(不可取)
2.打开一个文件,修改完写入一个新文件里面
如下:
f= open("lyrics","r",encoding="utf-8") f_new= open("new-lyrics.bak",'w',encoding="utf-8") for line in f: if"原文内容哈哈哈" in line: line = line.replace("原文内容哈哈哈","更改内容嘿嘿嘿") f_new.write(line) f.close() f_new.close()
with语句
为了避免忘记打开文件,可以用with
with open("lyrics","r", encoding="utf-8") as f: for line in f: print(line) #不用执行关闭文件操作
当with 代码块执行完毕后,内部会自动关闭并释放文件资源