• 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
    五二三四五六七八
    六二三四五六七八
    七二三四五六七八
    八二三四五六七八

    解释:

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

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

  • 相关阅读:
    Javascript-DOM
    我的小站成长之路
    Reverse Proxy Vs Forward Proxy
    SSO-单点统一登录系统的设计与实现
    关于网络实名制
    LoggerOne
    AmpOne
    Get a handle on PHP Handlers
    Which PHP mode? Apache vs CGI vs FastCGI
    强制浏览器在点击回退按钮时重载刷新页面
  • 原文地址:https://www.cnblogs.com/mclind/p/8914941.html
Copyright © 2020-2023  润新知