python3速查参考- python基础 5 -> 常用的文件操作
文件的打开方式
打开方式 | 详细释义 |
r | 以只读方式打开文件。文件的指针会放在文件的开头。这是默认模式。 |
rb | 以二进制只读方式打开一个文件。文件指针会放在文件的开头。 |
r+ | 以读写方式打开一个文件。文件指针将会放在文件的开头。(读取文件时,只能读,不能新建,如果文件没有,则会异常报错) |
rb+ | 以二进制读写方式打开一个文件。文件指针会放在文件的开头。 |
w | 以写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件 |
wb | 以二进制写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件 |
w+ | 以读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件 |
wb+ | 以二进制读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件 |
a | 以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件尾,新的内容会写入到已有内容之后,如果该文件不存在,则创建新文件来写入 |
ab | 以二进制追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件尾,新的内容会写入到已有内容之后,如果该文件不存在,则创建新文件来写入 |
a+ | 以读写方式打开一个文件,如果该文件已存在,文件指针将会放在文件尾,新的内容会写入到已有内容之后,如果该文件不存在,则创建新文件来写入 |
ab+ | 以二进制追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件尾,新的内容会写入到已有内容之后,如果该文件不存在,则创建新文件来写入 |
文件的读操作
示例:
1 print("->文件句柄的获取,读操作:") 2 3 f = open('无题','r',encoding='utf8') #此行作用就是获取文件句柄 4 d = f.read() #read方法读取文件所有内容 5 f.close() 6 print(d) 7 8 print('->例二:') 9 f = open('无题','r',encoding='utf8') 10 e = f.read(9) #read方法中索引表示读取字符数 11 f.close() 12 print(e) 13 #python3中,文件中一个中英文都占位1
运行结果:
->文件句柄的获取,读操作: 昨夜星辰昨夜风 画楼西畔桂堂东 身无彩凤双飞翼 心有灵犀一点通 ->例二: 昨夜星辰昨夜风 画
文件的写操作
知识点:
1. 写操作前,文件先格式化清空文件
2.清空操作,在执行open的w方法后,清空
1 print("写的操作,写文件的时候,不能调用读方法,读文件的时候,不能调用写方法") 2 3 f = open('python','w',encoding='utf8') 4 f.write("I must learn python \nbecause, python is important \n") 5 f.write("java is better?") 6 f.write("maybe") #上面的语句,没有加换行符,所以输出的内容是紧接的 7 f.close()
运行结果:
打开文件后显示如下
I must learn python because, python is important java is better?maybe
文件的append方法
语法格式:
f = open('文件名','a','encoding = utf8')
文件这种方法为追加模式:1, 空白文件中,直接从头开始写入内容; 2 有内容的文件,会在末尾开始继续写入内容
示例:
f = open('python','a',encoding='utf8') f.write("花开又花落") f.close()
运行结果:
I must learn python because, python is important java is better?maybe花开又花落
readline 和 readlines
readline是逐行读取
readlines是全文读取
示例1 readline示例:
# -*- coding:utf-8 -*- ''' 实际的工作中,使用的方法几乎为readline方法 ''' print("readline方法") f = open('无题','r',encoding='utf-8') a = f.readline() #读取一行内容 print("此时光标位置:",f.tell()) b = f.readline() #继续读取一行内容 print("此时光标位置:",f.tell()) print(a.strip()) #strip是字符串方法中去除空格和换行的方法 print(b.strip())
运行结果:
readline方法 此时光标位置: 23 此时光标位置: 46 昨夜星辰昨夜风 画楼西畔桂堂东
我读取的文件内容原件:
昨夜星辰昨夜风
画楼西畔桂堂东
身无彩凤双飞翼
心有灵犀一点通
南京
江苏
中国
示例2 文件内容的遍历示例:
#遍历文件,在第四行打印分割线,然后继续循环 count = 0 f = open('无题','r',encoding='utf-8') for line in f: if count == 3: print('%%%%####%%%%') count+=1 continue print(line.strip()) count+=1 f.close()
运行结果:
昨夜星辰昨夜风 画楼西畔桂堂东 身无彩凤双飞翼 %%%%####%%%% 南京 江苏 中国
示例3 readlines方法:
print("readlines方法,会将每行的内容组成一个列表打印") f = open('无题','r',encoding='utf8') c = f.readlines() print(c) print(id(c)) print(id(f)) for i in c: print(i.strip()) print("遍历方法") f.seek(0) #将文件指针设置到初始位置,就是文件开头 for i in f: print(i.strip()) f.close() #文件的操作中,close()方法一定不能忘记
运行结果:
readlines方法,会将每行的内容组成一个列表打印 ['昨夜星辰昨夜风\n', '画楼西畔桂堂东\n', '身无彩凤双飞翼\n', '心有灵犀一点通\n', '南京\n', '江苏\n', '中国'] 38154568 3902272 昨夜星辰昨夜风 画楼西畔桂堂东 身无彩凤双飞翼 心有灵犀一点通 南京 江苏 中国 遍历方法 昨夜星辰昨夜风 画楼西畔桂堂东 身无彩凤双飞翼 心有灵犀一点通 南京 江苏 中国
文件的tell() 和 seek()方法
示例:
f = open('无题','r',encoding='utf8') f.read(4) print('当前光标位置',f.tell()) f.seek(10) print('当前光标位置',f.tell()) f.close() #read时,一个中文算三个字符
运行结果:
当前光标位置 12
当前光标位置 10
文件操作之flush方法
import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(1)
truncate方法
f = open('test','w') f.write("hello") f.write("\n") f.write("python") f.flush() #这样不用执行close方法,内存中的数据,就会写入到disk f.close() f = open('test','a') f.truncate(2) #截断方法,光标从2开始往后截取 f.close()
文件常用的方法汇总如下:
#-- 文件基本操作 output = open(r'C:\spam', 'w') # 打开输出文件,用于写 input = open('data', 'r') # 打开输入文件,用于读。打开的方式可以为'w', 'r', 'a', 'wb', 'rb', 'ab'等 fp.read([size]) # size为读取的长度,以byte为单位 fp.readline([size]) # 读一行,如果定义了size,有可能返回的只是一行的一部分 fp.readlines([size]) # 把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长。 fp.readable() # 是否可读 fp.write(str) # 把str写到文件中,write()并不会在str后加上一个换行符 fp.writelines(seq) # 把seq的内容全部写到文件中(多行一次性写入) fp.writeable() # 是否可写 fp.close() # 关闭文件。 fp.flush() # 把缓冲区的内容写入硬盘 fp.fileno() # 返回一个长整型的”文件标签“ fp.isatty() # 文件是否是一个终端设备文件(unix系统中的) fp.tell() # 返回文件操作标记的当前位置,以文件的开头为原点 fp.next() # 返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。 fp.seek(offset[,whence]) # 将文件打操作标记移到offset的位置。whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。 fp.seekable() # 是否可以seek fp.truncate([size]) # 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。 for line in open('data'): print(line) # 使用for语句,比较适用于打开比较大的文件 open('f.txt', encoding = 'latin-1') # Python3.x Unicode文本文件 open('f.bin', 'rb') # Python3.x 二进制bytes文件 # 文件对象还有相应的属性:buffer closed encoding errors line_buffering name newlines等