基本操作
f = open("file1", "r") # 打开文件
first_line = f.readline() # 读一行
data = f.read() # 读取剩下所有内容,文件大时候不要用
f.close() #关闭文件
如果我们想循环文件,并且在第九行输出分割的话:
for index, line in enumerate(file.readlines()):
if(index == 5):
print("-------我是分割线-------")
continue
print(line.strip())
注意: strip()方法是用来去除字符串首尾空格的
但是当我们打开一个大文件的时候我们就会发现一个问题,file.readlines()是提前将所有行数都先读取出来,再进行操作,那么当我们打开一个几十个G的文件的时候效果可想而知,因此上述方法基本不使用,应该使用以下方法:
count = 0
for line in file:
if count == 9:
print("-------我是分割线-------")
count += 1
continue
print(line)
count += 1
打开文件的模式有:
- r, 只读模式(默认)
- w,只写模式【不可读;不存在则创建;存在则删除内容】
- a,追加模式【可读;不存在则创建;存在则只追加内容】
“+”表示可以同时读写某个文件
- r+,可读写文件【可读;可写;可追加】-----一般使用这个模式
- w+,可写读文件【可写;可读;可追加】-----基本用不到
- a+,追加读写文件
“b”表示处理二进制文件(如:FTP发送上传ISO镜像文件,Linux可忽略,windows处理二进制文件时需要标注)
- rb,以二进制的模式读取文件,不可以传encoding参数
- wb,以二进制编码的模式写文件
f.write("string字符串".encode())
“U”表示在读取时,可以将\r\n \r \n自动转换成\n(与r或r+模式同时使用)
- rU
- r+U
文件的方法
- tell() 当前文件指向的指针,计数方式是按照字符个数
- seek(字符位置) 查找文件相应字符位置
seek(0)就是返回到文件开始位置,一般和tell()方法一起使用- encoding() 返回当前文件编码格式
- flush() 刷新当前缓冲区,建议在关闭文件前先flush当前缓冲区。
模仿进度条: import sys, time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)
在前面,我们已经注意到python写文件的时候,会将之前的内容删除掉,重写覆盖,那么我们如何来修改文件呢?
文件修改的方式
- 将文件加载到内存中像VIM那样,再进行修改
- 打开一个文件,修改完成之后写到新文件里
修改文件的思路
- 打开两个文件
- 从源文件逐行读取,边读边写进新文件中
- 通过语句进行判断,找到需要需改的地方,修改文件,再将修改过后的内容写到新文件中。
f = open("yesterday", ‘r‘, encoding="utf-8")
fnew = open("yesterday.bak", "w", encoding="utf-8")
for line in f:
if "修改前的语句" == line:
line = line.replace("修改前的语句", "修改后的语句")
fnew.write(line)
f.close()
fnew.close()
line = line.replace("修改前的语句", "修改后的语句")
注意是line
而不是f
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open("需要打开的文件", ‘r‘, encoding="utf-8") as f:
# 执行语句...
# 当跳出with程序块时,自动关闭文件
如此方式,当with代码块执行完毕后,内部会自动关闭并释放文件资源。 在python2.7后,with又支持同时对多个文件的上下文进行管理,即:
with open("需要打开的文件1") as f, open("需要打开的文件2") as f2:
# 执行语句...
# 当跳出with程序块时,自动关闭文件