Python13:文件操作

文件操作简单来讲,就是打开,操作,关闭。和生活中打开文件是一样的逻辑。其中打开包括获取文件位置,也和生活中的操作一样。

现在随便找一个文件,用于学习,文件名叫file_test。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

data = open("file_test",encoding="utf-8").read()
print(data)

输出:

在我年轻时,有本神奇的杂志叫做 Whole Earth Catalog,当年我们很迷这本杂志。那是一位住在离这不远的Menlo ParkStewart 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
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
data = f.read()
data2 = f.read()
print(data)
print("-------data2---------",data2)

输出:

在我年轻时,有本神奇的杂志叫做 Whole Earth Catalog,当年我们很迷这本杂志。那是一位住在离这不远的Menlo ParkStewart Brand发行的,他把杂志办得很有诗意。那是1960年代末期,个人计算机跟桌上出版还没发明,所有内容都是打字机、剪刀跟拍立得相机做出来的。杂志内容有点像印在纸上的Google,在Google出现之前35年就有了:理想化,充满新奇工具与神奇的注记。Stewart跟他的出版团队出了好几期 Whole Earth Catalog,然后出了停刊号。当时是1970年代中期,我正是你们现在这个年龄的时候。在停刊号的封底,有张早晨乡间小路的照片,那种你去爬山时会经过的乡间小路。在照片下有行小字:求知若饥,虚心若愚。那是他们亲笔写下的告别讯息,我总是以此自许。当你们毕业,展开新生活,我也以此期许你们。求知若饥,虚心若愚。

非常谢谢大家。

-------data2---------

解释:

open():当open()打开文件后,其实是获得了文件的句柄,在文件开头的位置。

data = f.read():第一次读操作读取了全文件,获得的数据给data.

data2 = f.read():第二次读操作,句柄到了末尾,所以第二次读操作是获取不到内容的。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
data = f.read()
f.write("找到你所喜欢的东西")
print(data)

输出:

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
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test","r",encoding="utf-8")
print(f.read())
f.close()

输出:

非常谢谢大家。

Process finished with exit code 0

解释:

f = open("file_test","r",encoding="utf-8"):加不加“r”都是一样,打开的默认方式就是这种读的方式操作,若进行写操作则会出错。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test2","w",encoding="utf-8")
f.write("人生中的点点滴滴")
f.write("总要串在一起 ")
f.write("你必须找到你爱的东西 ")
f.close()

输出:

人生中的点点滴滴总要串在一起
你必须找到你爱的东西
你必须全力以赴你会明白生命

解释:

f = open("file_test2","w",encoding="utf-8"):注意,此种是以写的模式打开一个文件,其实不是打开,是创建并打开,如果此时输入的参数是原有的文件,也会重新创建并打开,原有的文件则会删除,慎用。此时只能以写的方式打开文件,若尝试读文件则会出错。

输出:此程序的输出是在打开的文件里,可以看到你写的东西保存在了文章里。

f.write("人生中的点点滴滴")
f.write("总要串在一起 "):普通写,如果句子末尾不带“ ”,则不换行一直写,如果有换行符,则另起一行重新写。

f.close():关闭文件,处理完文件后的良好习惯操作。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test2","a",encoding="utf-8")
f.writelines("没有人想死")
f.writelines("用爱去生活")
f.close()

输出:

解释:

f = open("file_test2","a",encoding="utf-8"):以追加的方式打开文件,这种方式不会删除原文件,打开后可以在句柄后边添加写操作,但不能进行读操作。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
print(f.readline())
print(f.readline())
f.close()

输出:

你必须要找到你所爱的东西

今天,有荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业。说实话,这是我离大学毕业最近的一刻。今天,我只说三个故事,不谈大道理,三个故事就好。

Process finished with exit code 0

解释:

print(f.readline()):每次读取一行。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
for i in range(5):
    print(f.readline())
f.close()

输出:

你必须要找到你所爱的东西

今天,有荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业。说实话,这是我离大学毕业最近的一刻。今天,我只说三个故事,不谈大道理,三个故事就好。

一、第一个故事,是关于人生中的点点滴滴怎么串连在一起

我在里德学院(Reed college)待了六个月就办休学了。到我退学前,一共休学了十八个月。

那么,我为什么休学? 这得从我出生前讲起。

Process finished with exit code 0

解释:

for i in range(5):
    print(f.readline())

循环输出前5行。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
for i in f.readlines():
    print(i)
f.close()

输出:

。。。

非常谢谢大家。

Process finished with exit code 0

解释:

for i in f.readlines():
    print(i)

readlines():遍历文件,循环输出。但这种方法不好,如果文件过大,会给内存造成压力甚至内存溢出。建议用下面方法遍历文件。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
for i in f:
    print(i)
f.close()

输出:

。。。

非常谢谢大家。

Process finished with exit code 0

解释:

for i in f:
    print(i)

此时遍历ff就形成了一个迭代器。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
count = 0
for data in f:
    count +=1
    if count == 9:
        print("我是第十行")
        continue
    print(data)
f.close()

输出:

。。。

我是第十行

举例来说:

。。。

解释:

中间处理文件,遇到第十行,跳过。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

with open("file1","r",encoding="utf-8") as f:
    for line in f:
        print(line)

输出:

一二三四五六七八

二二三四五六七八

三二三四五六七八

四二三四五六七八

五二三四五六七八

六二三四五六七八

七二三四五六七八

八二三四五六七八

Process finished with exit code 0

解释:

文件的with操作,因为打开文件操作后总要关闭文件,但有时候会忘记关闭,如果打开文件过多,内存中会存在过多文件句柄,造成压力,所以可以使用with操作,处理完文件后会自动关闭文件,而不用再使用close()方法关闭。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
print(f.tell())

输出:

0

Process finished with exit code 0

解释:

f.tell():打印开始句柄的位置

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
print(f.readline())
print(f.tell())

输出:

你必须要找到你所爱的东西

38

Process finished with exit code 0

解释:

句柄的移动,是按字符计数的。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
print(f.readline())
print(f.tell())
f.seek(0)
print(f.readline())
print(f.tell())

输出:

你必须要找到你所爱的东西

38

你必须要找到你所爱的东西

38

Process finished with exit code 0

解释:

f.seek(0):设置句柄的位置

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test",encoding="utf-8")
print(f.encoding)

输出:

utf-8

Process finished with exit code 0

解释:

f.encoding:查看文件编码。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test","r+",encoding="utf-8")
print(f.readline())
print(f.readline())
print(f.tell())
print(f.write("time to sleep "))
f.close()

输出:

一二三四五六七八

二二三四五六七八

52

14

Process finished with exit code 0

解释:

f = open("file_test","r+",encoding="utf-8"):以读写的方式打开文件,读的时候从头读,但写的时候是追加,从最后开始写。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f = open("file_test","w+",encoding="utf-8")
f.write("time to play ")
f.write("time to sleep ")
print(f.tell())
f.seek(5)
f.write("time to happy ")
print(f.readline())

f.close()

输出:

29

to play

Process finished with exit code 0

解释:

f = open("file_test","w+",encoding="utf-8"):以写读的方法打开文件,会清空内容(重新创建一个文件覆盖旧的),写的时候也是追加,在最后的地方写入,读的时候从第一个位置读,或者设置句柄的位置开始读。

方法操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Mclind

f1 = open("file1","r",encoding="utf-8")
f2 = open("file2","w",encoding="utf-8")
for line in f1:
    if "四二三四五六七八" in line:
        line = line.replace("四二三四五六七八","Python is my goal")
    f2.write(line)

f1.close()
f2.close()

file2.txt输出:

一二三四五六七八
二二三四五六七八
三二三四五六七八
Python is my goal
五二三四五六七八
六二三四五六七八
七二三四五六七八
八二三四五六七八

解释:

文件的修改,一种是全把文件读到内存,然后修改,再保存到内存,但若遇到大文件,对内存是一种压力。

一种是打开文件读,再打开一个文件写,可以一行一行的读,然后写入到新文件,很繁琐,但实用。

原文地址:https://www.cnblogs.com/mclind/p/8914941.html