读取一个文件需要有:地址,读取方式,编码格式;
假设d盘根目录有一个文件叫做艾克.txt,那么读取代码为:
f = open('d:艾克',mode='r',encoding='utf-8') #open(地址,读出方式,编码格式)
这是新建一个对象,每次读取后都要用f.close()进行退出,不然会一直读取占用内存,所以一般都采用下列方法读取,不用每次都输入close退出:
with open('d:艾克',mode='r',encoding='utf-8') as f:
读取方式:
r | 只读 | 只用于读,打印时,控制台会打印出读取文件内容,写入或追加会报错 |
rb | 以二进制打开一个文件用于只读 | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且,如果是以带有b的模式操作文件,那么不用声明编码方式。在带有写入或者追加的模式下进行b模式时,进行写入文字操作,需要进行转码操作 |
r+ | 打开一个文件用于读写 | 打开一个文件用于读写。文件指针默认将会放在文件的开头。如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。解决办法是先读一遍再写入,此时光标位置会是在最后面,写入内容将从后边开始添加,不会将前边内容覆盖 |
r+b | 以二进制打开一个文件用于读写 | 以二进制打开一个文件用于读写。 结合上方rb与r+特性进行参考 |
w | 只写 | 只用写入,写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容 。若无该文件,会先在该目录创建一个文件再写入 |
wb | 以二进制打开一个文件用于只写 | 以二进制格式打开一个文件只用于写入。写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容 。若无该文件,会先在该目录创建一个文件再写入,一般用于非文本文件如:图片,音频,视频等。 并且,如果是以带有b的模式操作文件,那么不用声明编码方式。在带有写入或者追加的模式下进行b模式时,进行写入文字操作,需要进行转码操作 |
w+ | 打开一个文件用于写读 | 打开一个文件用于写读,写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容。写入字符串后可以指定光标位置继续写入,重新运行后再次清空 |
w+b | 以二进制打开一个文件用于写读 | 以二进制打开一个文件用于写读。 结合上方wb与w+特性进行参考 |
a | 追加 | 只用于追加,不会对文件进行清空操作,追加默认是在文件的最后 |
ab | 以二进制打开一个文件用于追加 | 以二进制打开一个文件用于追加。不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 |
a+ | 打开一个文件用于追加读 | 打开一个文件用于追加读, 不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 |
a+b | 以二进制打开一个文件用于追加读 | 以二进制打开一个文件用于追加读, 不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 |
部分测试代码:
r、rb、r+
#演示文件夹地址为相对路径,即在工作文件夹的目录下 #mode = 'r' l = open('艾克',mode='r',encoding='utf-8') # reading = l.read() # print(reading) # l.close() # mode = 'rb' l = open('艾克',mode='rb') reading = l.read() print(reading) l.close() #with as 模式读取文件 #读写 mode = 'r+' # 这个模式下,如果你在读写模式下,先写后读,那么文件就会出问题, # 因为默认光标是在文件的最开始,你要是先写,则写入的内容会将原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。 # 解决办法是先读一遍再写入,此时光标位置会是在最后面,写入内容将从后边开始添加,不会将前边内容覆盖 with open('艾克',mode='r+',encoding='utf-8') as l: # print(l.tell()) # l.seek(0) print(l.read()) # l.seek(6) l.write('你好') print(l.read())
w、wb、w+
# made = 'w' # l = open('aike',mode='w',encoding='utf-8') # reading = l.write('艾克你好艾克你好艾克你好艾克你好艾克你好') # l.close() #mode = 'wb' l = open('aike',mode='wb') reading = l.write('艾克你好艾克你好艾克你好艾克你好艾克你好'.encode('utf-8')) l.close() #写读 mode = 'w+' 写入时,每一次运行都会将所有内容清空再写入,写入一条后可以指定光标位置继续写入 with open('艾克',mode='w+',encoding='utf-8') as l: # l.write('你好') # l.seek(3) # l.write('艾克') # print(l.read()) l.write('zzz') print(l.read())
其它功能用法:
# f = open('log',mode='r+',encoding='utf-8') # content = f.read(3) # 读出来的都是字符 # f.seek(3) # 是按照字节定光标的位置 # f.tell() 告诉你光标的位置 # print(f.tell()) # content = f.read() # print(content) # f.tell() # f.readable() # 是否刻度 # line = f.readline() # 一行一行的读 # line = f.readlines() # 每一行当成列表中的一个元素,添加到list中 # f.truncate(4) # for line in f: # print(line) # f.close()
注:光标位置的指定是以字节来数,而读取时以字符。