一、文件操作
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
打开文件
假设我们有一个file.txt文件,内容为:
abcdefg
jijklmn
opqtsr
uvwxyz
# Author:Tim Gu data = open('file.txt',encoding="utf-8").read() print(data)
输出:
abcdefg
jijklmn
opqtsr
uvwxyz
读文件:
# Author:Tim Gu f = open('file.txt','r',encoding='utf-8') data = f.read() print(data) >>> abcdefg jijklmn opqtsr uvwxyz
写文件:
f = open('file.txt2','w',encoding='utf-8') #文件句柄,使用w时事实上是创建了一个新文件,如果源文件存在,会覆盖 f.write("I will go home!") f.write('\nByeBye!') f.write('\nadfas')
追加文件:
f = open('file.txt2','a',encoding='utf-8') #文件句柄 f.write("See you,tomorrow!")
打开文件file.txt2
I will go home!
ByeBye!
adfasSee you,tomorrow!
以行读取文件:
# Author:Tim Gu f = open('file.txt2','r',encoding='utf-8') #文件句柄 print(f.readline()) #读取一行 for i in range(2): #使用for循环读取2行 print(f.readline())
使用readline()读取的是文件的单行,readlines()会读取文件全部行,每行作为一个元素形成一个列表。readlines()因为会一下子把文件全部读取到内存,所以只适合读小文件。
下面示例读取文件,但不读取第10行:
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') #文件句柄 #print(f.readlines()) for index,line in enumerate(f.readlines()): #使用遍历读取文件 if index == 9: print('------------------我是分割线-------------------') continue print(line.strip())
输出:
从前现在过去了再不来 红红落叶长埋尘土内 开始终结总是没变改 天边的你飘泊白云外 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 情人别后永远再不来(消散的情缘) ------------------我是分割线------------------- 鲜花虽会凋谢(只愿) 但会再开(为你) 一生所爱隐约(守候) 在白云外(期待) 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份
处理大文件的方法:这行代码的效果和上面的一样,只是使用了迭代器,使得内存可以只保留一行
f = open('file3.txt','r',encoding='utf-8') #文件句柄 count = 0 for line in f: #一行行读取文件,内存中只保留一行。 if count == 9: print('------------我是分割线---------------') count += 1 continue else: print(line.strip()) count += 1
光标处理:seek()用法
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') #文件句柄 print(f.tell()) #读取光标坐在位置 print(f.readline()) #读取一行 print(f.readline()) #读取第二行 print(f.readline()) #读取第三行 print(f.tell()) #打印光标所在位置 f.seek(0) #使光标回到原点 print(f.tell()) #打印光标位置 >>> 0 从前现在过去了再不来 红红落叶长埋尘土内 开始终结总是没变改 90 0
flush()实时将数据写入磁盘
打印进度条的小方法:
# Author:Tim Gu import sys,time for i in range(20): sys.stdout.write("#") #sys.stdout方法在同一行打印 sys.stdout.flush() #每打印一个#符号写入一次 time.sleep(0.3) #每打印一次隔0.3秒 >>> ####################
truncate() 截断文件,可以清空文件
# Author:Tim Gu f = open('file.txt','a',encoding='utf-8') f.truncate(10) #保留文件前10个字符,其余截断
文件的模式:r+读写模式:这段代码会先读取3行,然后再在文件最后写入"-------------------------------------"
# Author:Tim Gu f = open('file.txt','r+',encoding='utf-8') #读写 print(f.readline()) print(f.readline()) print(f.readline()) f.write("----------------------------------------------") print(f.readline())
文件的模式:w+ 写读模式:会创建新文件,此段代码会覆盖掉源文件
# Author:Tim Gu f = open('file.txt','w+',encoding='utf-8') #写读 print(f.readline()) print(f.readline()) print(f.readline()) f.write("----------------------------------------------") print(f.readline())
tell()和seek()联合使用:
# Author:Tim Gu f = open('file.txt','w+',encoding='utf-8') #写读 f.write("-----------------------------1------------------------") f.write("\n-----------------------------2------------------------") f.write("\n-----------------------------3------------------------") f.write("\n-----------------------------4------------------------") print(f.tell()) #打印光标所在位置 f.seek(10) #使光标回到第十个字符的位置 print(f.readline()) #打印当前行 >>> 222 -------------------1------------------------
此时文件内容:
-----------------------------1------------------------ -----------------------------2------------------------ -----------------------------3------------------------ -----------------------------4------------------------should be at the begining of the second line
line.replace的用法,修改文件中的某一行内容:
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') f_new = open('file3.bak','w',encoding='utf-8') for line in f: if '天边的你飘泊白云外' in line: line = line.replace('天边的你飘泊白云外','aaaaaaaaa') #修改这一行字符串 f_new.write(line) f.close() f_new.close()
使用with打开文件:
with open('file.txt','r',encoding='utf-8') as f,\ open('file3.txt','r',encoding='utf-8') as f2: for line in f: print(line) for line in f2: print(line)
注:因实际开发过程中,打开文件很容易忘记关闭文件,造成内存不能释放,所以一般可以选择使用with open方法打开文件
python3的新特性:x
f = open('1.txt','x',encoding='utf-8') #如果文件存在则报错,不存在则创建文件并只写
文件之ab模式:
f = open('1.txt','ab') #使用ab写文件 f.write(bytes('顾卿',encoding='utf-8')) #因为有b,所以必须传字节类型,所以使用bytes把字符串转化为字节类型 f.close()
seek()和tell()的特性:
模式r+一般比较常用,相比较a+,r+可控制指针位置来写,而a+则永远只能在末尾写
f = open('1.txt','r+',encoding='utf-8') #打开模式是r+(无b),读取按照字符读取 data = f.read(1) print(f.tell()) #tell当前指针所在的位置(字节) f.seek(f.tell()) #调整当前指针的位置(字节) f.write('888') #当前位置开始覆盖 f.close()
flush()的作用:
f = open('1.txt','a',encoding='utf-8') f.write('123') f.flush() #将缓存内容强制写进磁盘 input('asdfasd')
seekable():
是否可以移动指针
打开两个文件,将第一个文件的内容写进第二个文件:
with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2: times = 0 for line in f1: times += 1 if times <= 10: f2.write(line) else: break 读取第一个文件内容,修改后写入第二个文件: with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2: times = 0 for line in f1: new_str = line.replace('aaaaa','st') f2.write(new_str)