python--文件处理
对文件操作流程:
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
基本操作:
1 f = open('lyrics') #打开文件 2 first_line = f.readline() 3 print('first line:',first_line) #读一行 4 print('我是分隔线'.center(50,'-')) 5 data = f.read()# 读取剩下的所有内容,文件大时不要用 6 print(data) #打印文件 7 8 f.close() #关闭文件
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
常用操作:
1 data = open("test",encoding="utf-8").read() #打开test文件,encoding为保存时的编码 2 print(data) 3 # ok 4 # 正确打开了这个文件 5 6 print(open("test",encoding="utf-8").readline()) #读一行 7 #ok 8 9 f = open("test",encoding="utf-8") #这样可以一行一行的读取 10 print(f.readline()) 11 #ok 12 print(f.readline()) 13 # 正确打开了这个文件 14 15 f = open("lyrics",encoding="utf-8") 16 print(f.readline().strip()) #去掉换行符 17 #Somehow, it seems the love I knew was always the most destructive kind
打印一个文件中的前三行:
1 f = open("lyrics",encoding="utf-8") 2 for index,line in enumerate(f.readlines()): #取前三行,如果是大文件就不适用了,很占用内存 3 if index <3 : 4 print(line) 5 else: 6 break 7 # Somehow, it seems the love I knew was always the most destructive kind 8 # 9 # 不知为何,我经历的爱情总是最具毁灭性的的那种 10 # 11 # Yesterday when I was young 12 13 14 f = open("lyrics",encoding="utf-8") 15 for line in f: #一行行加载,输出所有内容 16 print(line.strip()) 17 18 19 f = open("lyrics",encoding="utf-8") #这样就是一行一行打印,打印前三行,只能用这两种方法实现 20 line_nu = 0 21 for line in f: 22 if line_nu < 3: 23 print(line) 24 line_nu += 1 25 else: 26 break 27 # Somehow, it seems the love I knew was always the most destructive kind 28 # 29 # 不知为何,我经历的爱情总是最具毁灭性的的那种 30 # 31 # Yesterday when I was young
1 #按照顺序进行操作 2 f = open("myfile","w") #w=write,创建写模式 3 f.write("我爱北京天安门") 4 f.write("毛泽") 5 f.close() 6 #我爱北京天安门毛泽 7 8 f = open("myfile","w") #w=write 9 f.write("我爱北京天安门\n") 10 f.write("毛泽\n") 11 f.close() 12 # 我爱北京天安门 13 # 毛泽 14 15 f = open("myfile","r+") #r+为读写模式 16 print(f.readline()) 17 f.write("insert\n") 18 f.close() 19 # 我爱北京天安门 20 # 毛泽 21 # insert 22 23 f = open("myfile","w+") #r+为写读模式 24 print(f.readline()) 25 f.write("insert2\n") 26 f.close() 27 #insert2 28 29 f = open("myfile","a+") #a+为追加读 30 print(f.readline()) 31 f.write("insert2\n") 32 f.close() 33 # insert2 34 # insert2 35 36 print(f.closed) #查看文件是否关闭 37 #True
1 f = open("myfile","r+") 2 f.write("hahaha\n") 3 f.flush() #实时刷数据到硬盘 4 5 f = open("lyrics","r+",encoding="utf-8") 6 f.seek(10) #寻找第几个字符,移动到那个位置,只有文本可以seek 7 print(f.readline()) 8 #t seems the love I knew was always the most destructive kind 9 10 f = open("lyrics","r+",encoding="utf-8") 11 f.seek(20) 12 f.truncate() #把光标位置后的内容都截断,对二进制文本有用,分布式下载可以把文件切成很多片 13 #Somehow, it seems th 14 15 f = open("lyrics","r+",encoding="utf-8") 16 f.seek(20) 17 f.truncate(100) #保留从头开始100个字符,一般不用 18 # Somehow, it seems the love I knew was always the most destructive kind 19 # 不知为何,我经历的爱 20 21 f = open("myfile","r+",encoding="utf-8") 22 data = ["xiaoming\n","dahong\n"] #向文件中写入一个字段后换行 23 f.writelines(data) 24 # xiaoming 25 # dahong
数据是存在硬盘个中的,当我们修改硬盘中的文件时,只能做到定长修改,因为改的是二进制,超出的则会覆盖,这就是为什么数据要加载到内存中
如果要删除一个大文件的其中两行,可以边读边加载,进行修改,写到一个新文件里,然后再删除原来的文件,这种方式浪费硬盘,如果全加载到内存中则浪费内存,这有这两种方式