Python13:文件操作
文件操作简单来讲,就是打开,操作,关闭。和生活中打开文件是一样的逻辑。其中打开包括获取文件位置,也和生活中的操作一样。
现在随便找一个文件,用于学习,文件名叫file_test。
方法操作:
#!/usr/bin/env python
|
输出:
在我年轻时,有本神奇的杂志叫做 Whole Earth Catalog,当年我们很迷这本杂志。那是一位住在离这不远的Menlo Park的Stewart Brand发行的,他把杂志办得很有诗意。那是1960年代末期,个人计算机跟桌上出版还没发明,所有内容都是打字机、剪刀跟拍立得相机做出来的。杂志内容有点像印在纸上的Google,在Google出现之前35年就有了:理想化,充满新奇工具与神奇的注记。Stewart跟他的出版团队出了好几期 Whole Earth Catalog,然后出了停刊号。当时是1970年代中期,我正是你们现在这个年龄的时候。在停刊号的封底,有张早晨乡间小路的照片,那种你去爬山时会经过的乡间小路。在照片下有行小字:求知若饥,虚心若愚。那是他们亲笔写下的告别讯息,我总是以此自许。当你们毕业,展开新生活,我也以此期许你们。求知若饥,虚心若愚。 非常谢谢大家。
Process finished with exit code 0 |
解释:
data = open("file_test",encoding="utf-8").read():简单的打开并读的方法,但这个方法并不好。其中open()是打开方法,"file_test"是文件相对位置的参数(就是和程序在同一个目录下),encoding="utf-8":告诉程序采用“utf-8”编参码(默认采用GBK编码)。read()就是读文件的方法。一次全部读完。
方法操作:
#!/usr/bin/env python
|
输出:
在我年轻时,有本神奇的杂志叫做 Whole Earth Catalog,当年我们很迷这本杂志。那是一位住在离这不远的Menlo Park的Stewart Brand发行的,他把杂志办得很有诗意。那是1960年代末期,个人计算机跟桌上出版还没发明,所有内容都是打字机、剪刀跟拍立得相机做出来的。杂志内容有点像印在纸上的Google,在Google出现之前35年就有了:理想化,充满新奇工具与神奇的注记。Stewart跟他的出版团队出了好几期 Whole Earth Catalog,然后出了停刊号。当时是1970年代中期,我正是你们现在这个年龄的时候。在停刊号的封底,有张早晨乡间小路的照片,那种你去爬山时会经过的乡间小路。在照片下有行小字:求知若饥,虚心若愚。那是他们亲笔写下的告别讯息,我总是以此自许。当你们毕业,展开新生活,我也以此期许你们。求知若饥,虚心若愚。 非常谢谢大家。
-------data2--------- |
解释:
open():当open()打开文件后,其实是获得了文件的句柄,在文件开头的位置。
data = f.read():第一次读操作读取了全文件,获得的数据给data.
data2 = f.read():第二次读操作,句柄到了末尾,所以第二次读操作是获取不到内容的。
方法操作:
#!/usr/bin/env python
|
输出:
Traceback (most recent call last): File "E:/python_code/s14/day03/file_demo.py", line 7, in <module> f.write("找到你所喜欢的东西") io.UnsupportedOperation: not writable
Process finished with exit code 1 |
解释:
f.write("找到你所喜欢的东西"):写操作,但程序出错了,此时程序打开的方式是以读的形式打开的,只能读,不能写,在open()方法中可以设置参数。f = open("file_test","r",encoding="utf-8")
方法操作:
#!/usr/bin/env python
|
输出:
非常谢谢大家。
Process finished with exit code 0 |
解释:
f = open("file_test","r",encoding="utf-8"):加不加“r”都是一样,打开的默认方式就是这种读的方式操作,若进行写操作则会出错。
方法操作:
#!/usr/bin/env python
|
输出:
人生中的点点滴滴总要串在一起
|
解释:
f = open("file_test2","w",encoding="utf-8"):注意,此种是以写的模式打开一个文件,其实不是打开,是创建并打开,如果此时输入的参数是原有的文件,也会重新创建并打开,原有的文件则会删除,慎用。此时只能以写的方式打开文件,若尝试读文件则会出错。
输出:此程序的输出是在打开的文件里,可以看到你写的东西保存在了文章里。
f.write("人生中的点点滴滴")
f.write("总要串在一起\n"):普通写,如果句子末尾不带“\n”,则不换行一直写,如果有换行符,则另起一行重新写。
f.close():关闭文件,处理完文件后的良好习惯操作。
方法操作:
#!/usr/bin/env python
|
输出:
|
解释:
f = open("file_test2","a",encoding="utf-8"):以追加的方式打开文件,这种方式不会删除原文件,打开后可以在句柄后边添加写操作,但不能进行读操作。
方法操作:
#!/usr/bin/env python
|
输出:
你必须要找到你所爱的东西
今天,有荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业。说实话,这是我离大学毕业最近的一刻。今天,我只说三个故事,不谈大道理,三个故事就好。
Process finished with exit code 0 |
解释:
print(f.readline()):每次读取一行。
方法操作:
#!/usr/bin/env python
|
输出:
你必须要找到你所爱的东西
今天,有荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业。说实话,这是我离大学毕业最近的一刻。今天,我只说三个故事,不谈大道理,三个故事就好。
一、第一个故事,是关于人生中的点点滴滴怎么串连在一起
我在里德学院(Reed college)待了六个月就办休学了。到我退学前,一共休学了十八个月。
那么,我为什么休学? 这得从我出生前讲起。
Process finished with exit code 0 |
解释:
for i in range(5):
print(f.readline())
循环输出前5行。
方法操作:
#!/usr/bin/env python
|
输出:
。。。 非常谢谢大家。
Process finished with exit code 0 |
解释:
for i in f.readlines():
print(i)
readlines():遍历文件,循环输出。但这种方法不好,如果文件过大,会给内存造成压力甚至内存溢出。建议用下面方法遍历文件。
方法操作:
#!/usr/bin/env python
|
输出:
。。。 非常谢谢大家。
Process finished with exit code 0 |
解释:
for i in f:
print(i)
此时遍历f,f就形成了一个迭代器。
方法操作:
#!/usr/bin/env python
|
输出:
。。。 我是第十行 举例来说: 。。。 |
解释:
中间处理文件,遇到第十行,跳过。
方法操作:
#!/usr/bin/env python
|
输出:
一二三四五六七八
二二三四五六七八
三二三四五六七八
四二三四五六七八
五二三四五六七八
六二三四五六七八
七二三四五六七八
八二三四五六七八
Process finished with exit code 0 |
解释:
文件的with操作,因为打开文件操作后总要关闭文件,但有时候会忘记关闭,如果打开文件过多,内存中会存在过多文件句柄,造成压力,所以可以使用with操作,处理完文件后会自动关闭文件,而不用再使用close()方法关闭。
方法操作:
#!/usr/bin/env python
|
输出:
0
Process finished with exit code 0 |
解释:
f.tell():打印开始句柄的位置
方法操作:
#!/usr/bin/env python
|
输出:
你必须要找到你所爱的东西
38
Process finished with exit code 0 |
解释:
句柄的移动,是按字符计数的。
方法操作:
#!/usr/bin/env python
|
输出:
你必须要找到你所爱的东西
38 你必须要找到你所爱的东西
38
Process finished with exit code 0 |
解释:
f.seek(0):设置句柄的位置
方法操作:
#!/usr/bin/env python
|
输出:
utf-8
Process finished with exit code 0 |
解释:
f.encoding:查看文件编码。
方法操作:
#!/usr/bin/env python
|
输出:
一二三四五六七八
二二三四五六七八
52 14
Process finished with exit code 0 |
解释:
f = open("file_test","r+",encoding="utf-8"):以读写的方式打开文件,读的时候从头读,但写的时候是追加,从最后开始写。
方法操作:
#!/usr/bin/env python
|
输出:
29 to play
Process finished with exit code 0 |
解释:
f = open("file_test","w+",encoding="utf-8"):以写读的方法打开文件,会清空内容(重新创建一个文件覆盖旧的),写的时候也是追加,在最后的地方写入,读的时候从第一个位置读,或者设置句柄的位置开始读。
方法操作:
#!/usr/bin/env python
|
file2.txt输出:
一二三四五六七八
|
解释:
文件的修改,一种是全把文件读到内存,然后修改,再保存到内存,但若遇到大文件,对内存是一种压力。
一种是打开文件读,再打开一个文件写,可以一行一行的读,然后写入到新文件,很繁琐,但实用。