文件操作介绍
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
Table 文件对象方法
方法 | 描述 |
f.close() | 关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。 |
f.fileno() | 获得文件描述符,是一个数字 |
f.flush() | 刷新输出缓存 |
f.isatty() | 如果文件是一个交互终端,则返回True,否则返回False。 |
f.read([count]) | 读出文件,如果有count,则读出count个字节。 |
f.readline() | 读出一行信息。 |
f.readlines() | 读出所有行,也就是读出整个文件的信息。 |
f.seek(offset[,where]) | 把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。 |
f.tell() | 获得文件指针位置。 |
f.truncate([size]) | 截取文件,使文件的大小为size。 |
f.write(string) | 把string字符串写入文件。 |
f.writelines(list) | 把list中的字符串一行一行地写入文件,是连续写入文件,没有换行。 |
read(3)代表读取3个字符,其余的文件内光标移动是以字节为单位,如:seek,tell,read,truncate
f.flush() #讲文件内容从内存刷到硬盘(python3.x)
f.closed #文件如果关闭则返回True
f.encoding #查看使用open打开文件的编码
f.tell() #查看文件处理当前的光标位置
f.seek(3) #从开头开始算,将光标移动到第三个字节
f.truncate(10) #从开头开始算,将文件只保留从0-10个字节的内容,文件必须以写方式打开,但是w和w+除外。
文件操作
读文件
- f是一个文件句柄,文件内存对像包含 (文件名,字符集,大小,硬盘的起启位置)
- 当读了一行之后,光标会移动到该行最末尾
普通读取
f = open('lyrics') #打开文件 first_line = f.readline() #读取一行信息 data = f.read()# 读取所有内容,文件大时不要用 print(data) #打印文件 f.close() #关闭文件
对二进制的内容进行读写
f = open("yesterday2",'wb') #文件句柄 二进制文件 f.write("hello binary\n".encode()) f.close()
高性能读取文件
f=open('yesterday','r',encoding='utf-8') for line in f print(f.strip()) f.close
写入内容
- 如果是空白的文件,那么以r写入内容
- 如果是已经有内容的文件,那么一定要用追加的模式 如果用w模式会被清空后写入
- 如果想修改文件,那么只能够新建一个文件,重新复制
f=open('yesterday2','w',encoding='utf-8') f.write('nihao') f.close()
seek()tell()
seek():移动文件读取指针到指定位置
语法:file.seek(offset,whence=0)
-->offset:偏移量,需要向前或向后移动的字节数,正往结束方向移动,负往开始方向移动。
-->whence:可选值,默认为0,这意味着绝对的文件定位,
1这意味着寻求相对于当前位置,
2表示相对于文件的末尾。
tell():返回文件读取指针的位置
f = open("yesterday2",'r',encoding="utf-8") print(f.tell()) #按字符计数 #print(f.readline()) #按字符进行读取 #print(f.read(5)) #只读5个字符 print(f.tell()) #回到第哪个字符 f.seek(0) #回到第0个字符 f.seek(10) #回到第10字符 print(f.readline())
读取最后一行
f=open('yesterday2','rb') for i in f: offs = -10 while True: f.seek(offs,2) # 从最后一行往前找 data = f.readlines() #一行一行找 if len(data) > 1: print('文件的最后一行是:%s' % (data[-1]).decode('utf-8')) # 读取文件最后一行 break offs *= 2 #相当于两倍文件的内容中查找 f.close()
flush 刷新
说明:写入的内容是存放在电脑的缓存中的,只有flush了一下,才会保存到硬盘中去。
#刚写完一行内容,如果断电,他就没有写进去,断电内存中数据就会丢失。如果没有断电,数据还在内存的缓存中,需要刷新一下,才能写到硬盘中。
#内存有一个大小限制,需要达到这个大小,才会把内存缓存中的内容写到硬盘中。
进度条:
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys,time for i in range(50): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)
truncate 截断文件
- 默认从0开始截断
- 需要截断某段内容seek移动光标,输入光标位置即可
f = open("yesterday2",'a',encoding="utf-8") #文件句柄 f.seek(10) f.truncate(20)
with上下文打开文件
- with打开文件可以实现自动关闭
- 内部打开文件时候执行__entry__方法
- 执行结束后执行__exit__方法关闭文件等处理后续操作
with open('log','r') as f: ...
打开多个
with open("yesterday2",'r',encoding="utf-8") as f ,\ open("yesterday2", 'r', encoding="utf-8") as f2: for line in f: print(line)
参考:https://www.cnblogs.com/nulige/p/6037752.html