首页 > 技术文章 > python学习暂时笔记-20180618

sgbeef 2018-06-18 11:13 原文

文件操作

注:能调用方法的一定是对象

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()

用于调整内存光标位置

推荐阅读