文件处理流程
1.打开文件,得到文件语句柄 并赋值给一个变量
2.通过语句柄对文件进行操作
3.关闭文件
基本操作
读操作
fn=open('test.txt') data=fn.read() print (data) 文件读操作,读出所有文件
fn=open('test.txt') print(fn.readline()) print(fn.readline()) print(fn.readline()) 一行一行的读文件。PS:print会自动换行,解决方法 print(fn.readline().strip(' ')) print(fn.readline().strip(' ')) print(fn.readline().strip(' '))
fn=open('test.txt') print (fn.readable()) 判断文件是否可读
fn=open('test.txt') print (fn.readlines()) 将文件以列表的方式读出
注意:读一行,光标向下移动一行。如果上面的操作读三行,那么再以readlines的方式查看就不会是所有的行都以列表的方式读出
fn=open('test.txt') print(fn.readline().strip(' ')) print(fn.readline().strip(' ')) print (fn.readlines()) 111111111111111111111111111 2222222222222222222222 ['333333333333333333333333 ', '4444444444444444444 ', '555555555555555555 ', '666666666666666 ']
fn=open('test.txt') for line in fn.readlines(): print (line).strip(' ') 循环文件,效率不高 fn=open('test.txt') for line in fn: print (line).strip(' ') 使用这种方法循环文件,则没问题。这是一个非常厉害的功能(迭代器),后续的文章会介绍
注意:每次在操作完文件后都要进行一次fn.close(文件关闭操作)。如果不关闭,则很会占用内存,一定要及时释放掉
上下文管理操作
with open('test.txt') as fn: print (fn.readlines()) 打开文件操作后无需关闭
写操作
在上面的例子中fn=open('test.txt')其实是可以在后面跟参数,写操作后面需要跟上'w',而读操作则不需要写,默认就是读操作.例子读fn=open('test.txt','r')
写fn=open('test.txt','w')
fn=open('test.txt','w') 写操作,如果有这个文件,会将原来的文件进行覆盖。没有这个文件则创建 fn=open('test2.txt','r') 读操作,如果有这个文件,则可以读。没有这个文件则报错。
fn=open('test1.txt','w') print (fn.writeable()) 判断文件是否可写
fn=open('test1.txt','w') print(fn.write('111 '))
print(fn.write('222 333 ')) 写文件,并返回写入几个字符
fn=open('test1.txt','w') fn.writelines(['1111 ','aaaa ','bbbb ']) fn.close()
注意,每次在操作文件结束后都要关闭文件哦!
测试
模仿vim更改文件内容
hello aaa
hello bbb
hello ccc
hello ddd
import os #导入os模块为下面改名做准备 old_fn=open('old','r') #读取源文件old new_fn=open('new','w') #打开新文件 for old_line in old_fn: #将文件中的行遍历出来 if old_line == 'hello aaa ': #匹配要修改的行 new_fn.write('hello 111 ') #将修改的文件写入新文件 continue #想要修改的行结束后,跳过循环 new_fn.write(old_line) #将不需要修改的文件写入新文件 old_fn.close() #关闭文件 new_fn.close() os.rename('old','.old.swp') #使用os模块将源文件改名 os.rename('new','old') #将新文件改为源文件名
使用上下文的方式来打开文件与关闭文件,就可以省略close的步骤
import os with open('old','r') as old_fn: with open('new','w') as new_fn: for old_line in old_fn: if old_line == 'hello aaa ': new_fn.write('111 ') continue new_fn.write(old_line) os.rename('old','.old.swp') os.rename('new','old')
注意:没有直接对硬盘文件修改那么一说。所有的文件修改都是将源文件从硬盘中读取到内存中,然后使用软件进行修改,将修改后的文件在刷回硬盘,覆盖源文件。切记!!!
文件处理高级操作
with open('a.txt','wb') as f: #wb是打开一个文件以二进制形式写文件 f.write('asdasdsa') #上面输出会报错 Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/untitled/day9/內建函数.py", line 18, in <module> f.write('asdasdsa') TypeError: a bytes-like object is required, not 'str'
#格式不
with open('a.txt','wb') as f: f.write(bytes('asdsdasd',encoding='utf-8')) #需要将文件的格式改变成bytes才能写入
这样的好处是可以跨平台
with open('a.txt','rb') as f: print(f.read()) #如果想要通过rb查看文件,那么将会看到一堆二进制 b'xe4xbdxa0xe5xa5xbdxe5x82xbbxe9x80xbcdasd'
如果想要看到正常的文件,那么既然有编码就要用解码(用什么格式编码就用什么格式解码)
with open('a.txt','rb') as f: print(f.read().decode(encoding='utf-8'))
其他操作(并不常用)
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
r ,只读模式 #默认模式,文件必须存在,不存在则抛出异常
w,只写模式 #不可读;不存在则创建;存在则清空内容
x, 只写模式 #不可读;不存在则创建,存在则报错
a, 追加模式 #可读; 不存在则创建;存在则只追加内容
"+" 表示可以同时读写某个文件
r+, 读写 #可读,可写
w+,写读 #可读,可写
x+ ,写读 #可读,可写
a+, 写读 #可读,可写
"b"表示以字节的方式操作
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
进度条
#进度条
import sys,time
for i in range(10): #循环输出10个#
sys.stdout.write('#') #sys.stdout跟print一样都是输出,只不过print是封装后输出
sys.stdout.flush() #sys.stdout.flush,将写入的文件刷出来,注意是不换行
time.sleep(0.2) #然后间隔0.2秒.一般来说这个间隔是看程序的运行或者启动时间来算的
文件位置(seek)
abc def ghi jkl mno
with open('a.txt','r') as f: print(f.tell()) #查看当前光标位置 print(f.read(2)) #读字符后面的数字是读取几个字符 print(f.tell()) #读取之后光标就会移动 f.seek(0) #移动光标到0 print('===================>') print(f.read()) #光标移动到0后,再次read会读出所有 #seek移动光标需要参照物,默认情况下参照物为开头,实际上seek有两个参数 print('===================>') f.seek(0) print(f.tell()) f.seek(0,2) #则代表参照开头移动一个光标,后面的数据代表三种模式分别为0,1,2 print(f.tell())
with open('a.txt','r+') as f: f.truncate(3) #truncate截断属于写文件用r+用w直接清空文件 #常用的就r,a,w