文件操作
注:能调用方法的一定是对象
1.文件的读操作
这是命名的一个文件“李白诗”
望庐山瀑布
[唐] 李白
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,疑是银河落九天。
文件的读操作:
1 f = open('李白诗','r',encoding='utf8') 2 date = f.read() 3 print(date) 4 f.close()
2.文件的写操作
1 f = open('李白诗','w',encoding='utf8') 2 date = f.write('hello world') 3 f.close()
注:但这时文件中的内容变成了hello world,以前的内容全部被覆盖掉了,但并不是在f.write('hello world')时清空的,而是在open()时清空的。
如果想追加而不是替换文本中的内容,应进行如下操作:
1 f = open('李白诗','a',encoding='utf8') 2 f.write('Hello world!') 3 f.close()
文本内容变为:
望庐山瀑布
[唐] 李白
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,疑是银河落九天。Hello world!
我们看到Hello world!追加到文本后面了,我们如果想让换行代码应该改为如下:
1 f = open('李白诗','a',encoding='utf8') 2 f.write('\nHello world!') 3 f.close()
文本内容变为:
望庐山瀑布
[唐] 李白
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,疑是银河落九天。
Hello world!
2.其他类型的文件读操作:
1 f = open('李白诗','r',encoding='utf8') 2 a =f.readline() 3 b = f.read(7) 4 c = f.read(5) 5 d = f.readlines() 6 print(a,b,c,d) 7 f.close()
诗原文:
望庐山瀑布
日照香炉生紫烟,
遥看瀑布挂前川。
飞流直下三千尺,
疑是银河落九天。
输出结果:
望庐山瀑布 日照香炉生紫烟 , 遥看瀑 ['布挂前川。\n', '飞流直下三千尺,\n', '疑是银河落九天。']
结论:readline()是读取一行,顺序往下进行,以\n为分界点,read()括号为空,代表读取全文,如果填入数字,代表读取多少个字节(包括标点、\n),readlines()读取结果为列表,并且以\n区分列表元素
3.针对readlines()输出问题
1 f = open('李白诗','r',encoding='utf8') 2 for i in f.readlines(): 3 print(i) 4 f.close()
此时输出结果为:
望庐山瀑布
#此换行为读取列表时的\n
日照香炉生紫烟,#第二个换行为print()默认的换行,所以就形成此输出结果
遥看瀑布挂前川。
飞流直下三千尺,
疑是银河落九天。
f.readlines()的输出为:
['望庐山瀑布\n', '日照香炉生紫烟,\n', '遥看瀑布挂前川。\n', '飞流直下三千尺,\n', '疑是银河落九天。']
但readlines()方式有一个致命的缺点,它在读取文件生成列表时,是将数据暂存在内存中的,处理小文件时还可以,如果针对大文件处理时就会出现内存不足或者运行缓慢的情况,这时我们要寻找一种更优化的方法。
4.用for i in f :此种句式
f与readline输出结果看起来相同,但处理方式完全不同,文件本身是存放在磁盘中,f是生成一种迭代器,取一个用一个,而不是将全部数据读取到内存中。
5.tell()
用来确定光标在内存中的位置
1 f = open('李白诗','r',encoding='utf8') 2 print(f.tell()) 3 print(f.read(2)) 4 print(f.tell())
望庐山瀑布
日照香炉生紫烟,
遥看瀑布挂前川。
飞流直下三千尺,
疑是银河落九天。
输出结果为:
0
望庐
6
可以看到虽然输出是两个字符,但光标位置变成了6,这是因为我们编码是utf8,一个中文字符python3认为是占3个位置,而如果改为英文,则一个字母占一个位置,所以如果我们改为GBK编码,则一个中文字符就占2个位置了。
6.seek()
用于调整内存光标位置