文件处理
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,可以将结果赋值给一个变量,这个变量我们称为句柄。这样我们就可以通过这个句柄对此文件进行操作。使用后关闭。
# f=open('文件路径','打开方式',encoding='字符编码') #f为文件句柄 # print('+++++>1',f.read()) #输出全部 # print(type(data)) # print('+++++>2',f.read()) #空 # print('+++++>3',f.read()) #空 # f.close() #文件关闭 # print(f) #可用 # f.read() #不可用 # del f #仅删除f句柄
回收资源
1 f.close():一定要做,关闭操作系统打开的文件,即回收操作系统的资源
2 del f:没必要做,因为在python程序运行完毕后,会自动清理与该程序有关的所有内存空间
文件打开模式
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Version : 1.0 # @Time : 2017/09/06 # @Author : tony # @File : File operation ####################### File operation read ... ############################ # with 有自动closed文件到功能... 也可同时打开多个文件 #with open('a.txt','r')as f1,open('b.txt','r')as f2, open('c.txt','r')as f3 : #with open('config.txt','r',encoding='utf-8') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. # windows 平台要加上encoding='utf-8' with open('config.txt','r') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. ff = f.read() # r.read() 是将文件全部读取到内存....大文件不能用次方法,内存受不了... print(ff) ''' 执行结果: 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cccccccccccccccccccccccccccccccc dddddddddddddddddddddddddddddddd 99999999999999999999999999999999 ''' #with open('config.txt','r',encoding='utf-8') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. # windows 平台要加上encoding='utf-8' with open('config.txt','r') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. ff = f.readline() # r.readline() 每次执行只读一行...... 可以循环读取整个文件..... print(ff) ''' 执行结果: 11111111111111111111111111111111 ''' #with open('config.txt','r',encoding='utf-8') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. # windows 平台要加上encoding='utf-8' with open('config.txt','r') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. for line in f: # 循环每一行, print(line.strip()) # strip()去掉每一行后面到换行符 ''' 执行结果: 11111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 22222222222222222222222222222222 33333333333333333333333333333333 99999999999999999999999999999999 ''' #with open('config.txt','r',encoding='utf-8') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. # windows 平台要加上encoding='utf-8' with open('config.txt','r') as f: # 参数 r 表示只读模式,次参数用时确保文件一定存在否者Error.. ff = f.readlines() # r.readlines() 读取文件所有行,返回一个list.. print(ff) ''' 执行结果: ['11111111111111111111111111111111 ', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ', '22222222222222222222222222222222 ', '33333333333333333333333333333333 ', 'cccccccccccccccccccccccccccccccc ', 'dddddddddddddddddddddddddddddddd ', '99999999999999999999999999999999 ', ' '] ''' with open('a.txt','a') as f: # 参数 a 表示追加模式..文件存在追加,不存在touch_file.. f.write('在文件到末尾追加内容... ') # r.readlines() 读取文件所有行,返回一个list.. print(ff) ''' 执行两次的结果: 在文件到末尾追加内容... 在文件到末尾追加内容... ''' ####################### File operation read ... ############################ with open('b.txt','w') as f: # w 参数是写到模式,文件不存在会创建文件,文件存在会清空重写... f.write('这里直接写字符串,并且最后加换行符 ') # 写一行字符串到文件里面 f.write('这里直接写字符串,并且最后加换行符 ') # 写一行字符串到文件里面 f.write('这里直接写字符串,并且最后加换行符 ') with open('c.txt','w') as f: # w 参数是写到模式,文件不存在会创建文件,文件存在会清空重写... # 多行写入文件,list 包起来 only list f.writelines(['writelines用list可以多行写入文件 ','writelines用list可以多行写入文件 ',]) f.writelines(['writelines用list可以多行写入文件 ','writelines用list可以多行写入文件 ',]) ''' r 只能读 r+ 可读可写 不会创建不存在的文件 从顶部开始写 会覆盖之前此位置的内容 w+ 可读可写 如果文件存在 则覆盖整个文件不存在则创建 w 只能写 覆盖整个文件 不存在则创建 a 只能写 从文件底部添加内容 不存在则创建 a+ 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建 ''' #################################### rb 模式 ############################################ with open('a.txt','rb') as f: # rb 模式 是按 字节读...bytes 汉字占三个bytes , # so rb 模式下时读中文 要是3的倍数.... 然后再decode utf-8 ff = f.read() print(ff) ''' b'xe5x9cxa8xe6x96x87xe4xbbxb6xe5x88xb0 ' ''' print(ff.decode('utf-8')) # 解码UTF-8 后 '''正常显示中文..'''
打开文件的模式有:
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
#文本文件:只读模式,文件不存在报错 f=open('aaaa.py','r') print(f.read()) #读所有 print(f.readline(),end='') #读行 print(f.readlines()) #读所有将每行放到数组中 print(f.readable()) #判断是否可读 print(f.writable()) #False f.close() #关闭
w,只写模式【不可读;不存在则创建;存在则清空内容】
#文本文件:只写模式,文件不存在则创建空文件,文件存在则清空 f=open('new.txt','w') f.write('1111111 ') #写入 f.writelines(['22222 ','3333 ','444444 ']) #写入三行 print(f.writable()) #判断是否可写入 f.close()
a, 追加模式【可读; 不存在则创建;存在则只追加内容】
#文本文件:只追加写模式,文件不存在则创建,文件存在可追加内容 # f=open('new_2','a',encoding='utf-8') # print(f.readable()) #False # print(f.writable()) #True # f.write('33333 ') # f.write('44444 ') # f.writelines(['5555 ','6666 ']) # f.close()
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
#可写可读 打开文件的时候文件就为空,写的是任意内容,读的是刚刚写进去的内容 #要想读,先移动光标 #读的光标和写的光标是两回事 f = open('复习.py','w+',encoding='utf-8') f.write('12237yuiayi') #seek 制定光标的位置在0位置 f.seek(0) print(f.read(3)) f.write('kahkshldkhd') print('***',f.read()) f.close()
w+,写读【可读,可写】
#可读可写 f = open('复习.py','r+',encoding='utf-8') print(f.read()) f.write(' ajshdjkdjk') f.close()
a+, 写读【可读,可写】
#追加可读 f = open('复习2.py','a+',encoding='utf-8') f.seek(0) print(f.read())
"b"表示以字节的方式操作
#rb f=open('aaaa.py','rb') print(f.read().decode('utf-8')) f=open('1.jpg','rb') data=f.read()
wb
#wb f=open('2.jpg','wb') f.write(data) f=open('new_3.txt','wb') f.write('aaaaa '.encode('utf-8'))
ab
#ab f=open('new_3.txt','ab') f.write('aaaaa '.encode('utf-8'))
此方式的操作可以对一些非字节文件做操作比如说图片,视频等任意文件。
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Author : tony # @Version : 1.0 # @Time : 2017/09/06 # @File : cp _File import time import sys # sys这个包括包含针对系统操作的一些api. sys.argv # sys.argv,获取执行脚本的参数返回一个list ,第一个参数是 # 脚本本身... if len(sys.argv) <3 : print('Usage:python3 copy.py source.file target.file') sys.exit ############ 通过文件操作 rb 模式 模仿一个cp 命令 ..... 拷贝×格式到文件都行... # linux 下 当前path 下.... print('start copy file {0}.....'.format(time.ctime())) # with 同时打开两个文件,一个读一个写.... with open(sys.argv[1],'rb') as f_read, open(sys.argv[2],'wb') as f_wirte: for line in f_read: # 循环读取原文件的每一行 f_wirte.write(line) # 一行一行写入新文件 print('End copy file {0}.....'.format(time.ctime())) ''' # Windows 下 当前path 下.... print('start copy file {0}.....'.format(time.ctime())) # with 同时打开两个文件,一个读一个写.... #r'C:UsersAdministratorPycharmProjectspython周末班day3 est.jpg' with open(r'%s'%sys.argv[1],'rb') as f_read, open(r'%s'%sys.argv[2],'wb') as f_wirte: for line in f_read: # 循环读取原文件的每一行 f_wirte.write(line) # 一行一行写入新文件 '''
文件的光标移动
read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
用只读方式和只写方式打开文件光标都在首,追写方式打开在尾。想要自己移动光标只能借助seek(光标位置)方法实现
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Version : 1.0 # @Time : 2017/03/20 # @Author : tony # @File : seek.py import sys import time ######## r 读取文件是按字符读取 ######## def seek_r(): with open('seekconfig.txt','r',encoding='utf-8') as f: # 按字符读取,encoding='utf-8' print(f.tell()) # tall 返回文件内的光所在的当前位置..... ''' 打印结果是 0,说明光标在文件头..''' print(f.read()) # 读取全部内容到内存,read()可以有参数的 '''打印结果:这个演示文件操作内光标的移动 这个演示文件操作内光标的移动 这个演示文件操作内光标的移动''' print(f.tell()) # tall 返回文件内的光所在的当前位置..... ''' 打印结果是 129,说明光标在文件last,也即读完了..''' print(f.read(1)) # 读取一个字符 == 一个汉字 'r'模式 '''打印结果:这 ''' # seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的 f.seek(3,0) # seek 按字节移动,一个汉字 == 3 个字节 print(f.read(1)) # 读取一个字符 == 一个汉字 'r'模式 '''打印结果:个 ''' print(f.tell()) # tall 返回文件内的光所在的当前位置按字节计算 ..... ''' 打印结果是 6,说明光标在文件第二个字到位置.......''' ######## rb 读取文件是按字节 bytes 读取 ######## def seek_rb(): with open('seekconfig.txt','rb') as f: # 按字节 bytes 读取,不需要encoding #print(f.tell()) # tall 返回文件内的光所在的当前位置..... ''' 打印结果是 0,说明光标在文件头..''' #print(f.read().decode('utf-8')) # 读取全部内容到内存,read()可以有参数的 # rb 模式读取 需要解码 decode.. '''打印结果:这个演示文件操作内光标的移动 这个演示文件操作内光标的移动 这个演示文件操作内光标的移动''' #print(f.read()) # 看一眼不编码的 字节 ... '''b'xe8xbfx99xe4xb8xaaxe6xbcx94''' #print(f.tell()) # tall 返回文件内的光所在的当前位置..... ''' 打印结果是 129,说明光标在文件last,也即读完了..''' #print(f.read(3).decode('utf-8')) # 按字节 bytes 读取 ,一个汉字占三个字节.. # 需要解码就得是3的倍数... '''打印结果:这 ''' # seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的 #f.seek(3,0) # seek 按字节移动,一个汉字 == 3 个字节 # 0 是相对值,就是文件开头.. 1 是当前tall... 2 是 文件末尾... #print(f.read(3).decode('utf-8')) # 读取下一个汉字 ... '''打印结果:个 ''' #print(f.tell()) # tall 返回文件内的光所在的当前位置按字节计算 ..... ''' 打印结果是 6,说明光标在文件第二个字到位置.......''' f.seek(0,2) # 将光标调至文件末尾去 print(f.tell()) # 打印光标 last position ####### 模仿 tail -f 命令 ... ################### if __name__ == '__main__': # seek_r() seek_rb()
上下文管理
#上下文管理 with open('aaaa.py','r',encoding='utf-8') as read_f, open('aaaa_new.py','w',encoding='utf-8') as write_f: #一行太长可以用来将一行分成两行或多行但本质还是一行 data=read_f.read() write_f.write(data) #不需要关闭(即不用close)此格式会自动关闭 #with open() as 句柄,open() as 句柄 : #可以一次打开多个 # 对文件的操作
循环每一行
with open('a.txt','r',encoding='utf-8') as f: while True: line=f.readline() if not line:break print(line,end='') lines=f.readlines() #只适用于小文件 print(lines) data=f.read() print(type(data)) for line in f: #推荐使用 print(line,end='')
文件的修改
#方式一:只适用于小文件 import os #导入os模块 with open('a.txt','r',encoding='utf-8') as read_f, open('a.txt.swap','w',encoding='utf-8') as write_f: data=read_f.read() write_f.write(data.replace('alex_SB','alex_BSB')) os.remove('a.txt') #移除 os.rename('a.txt.swap','a.txt') #重命名 #方式二: import os with open('a.txt','r',encoding='utf-8') as read_f, open('a.txt.swap','w',encoding='utf-8') as write_f: for line in read_f: write_f.write(line.replace('alex_BSB','BB_alex_SB')) os.remove('a.txt') os.rename('a.txt.swap','a.txt') #OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。
tail -f file.txt
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Version : 1.0 # @Time : 2017/09/06 # @Author : tony # @File : tail -f import sys import time def tail_f(): with open(sys.argv[2],'rb') as f_read: # seek(0,2) 必须用 rb 模式 f_read.seek(0,2) # 将内部光标调至文件末尾...... while True: # 一行行到读,去掉换行符 ff = f_read.readline().strip() if len(ff) != 0: # 根据长度判断是否读到..... print(ff.decode('utf-8')) # 有货就解码. print(ff) # 打印不解码到看看..... else: # 没有货 continue time.sleep(2) continue if __name__ == '__main__': if len(sys.argv) < 3: # 需要两个参数 -f file_name print('he second parameter requires a file') sys.exit # 参数不够... 提示 exit tail_f()