zoukankan      html  css  js  c++  java
  • 06-文件操作

    对文件进行操作。

    open()

    打开一个文件。

    该函数会得到一个文件对象的返回值,之后对文件进行读写操作都需要用这个文件对象。

    该方法有多个参数需要注意:

    file:文件路径。
    mode:文件打开方式
    buffering:设置缓冲。
    encoding:编码,一般为utf-8。
    errors:报错级别。
    newline:区分换行符。
    closefd:传入的file的参数类型。
    

    其中,尤其需要注意的是 mode 参数,这个参数有多个值可选:

    
    模式	描述
    t	文本模式 (默认)。
    x	写模式,新建一个文件,如果该文件已存在则会报错。
    b	二进制模式。
    +	打开一个文件进行更新(可读可写)。
    U	通用换行模式(Python 3 不支持)。
    r	以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb	以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+	打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+	以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w	打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb	以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+	打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+	以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a	打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab	以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+	打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+	以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    

    但是常用的文件打开模式一般在还有r w a rb wb ab r+ w+ a+

    f = open("test.txt", mode="r", encoding="utf-8")
    fs = f.read()
    print(fs)   # 这样可以获取到文件中的内容,但是由于是只用r模式,所以只能读出文件中内容不能向文件中写入
    

    文件对象方法:

    file.read([size]):
        读出文件中的全部内容。
        该函数有一个可选参数,这个参数表示从文件中读取的字节数。如果给定了参数,那么就读取一定量的文件内容;如果没有给定参数,就是默认读取文件中的全部内容。
    
    file.readline([size]):
        逐行读取文件中的内容。
        每次读取一行文件的内容 ,那么下一次再读取就是文件的第二行内容,已经被读取出来的文件不会被读取第二次。
        每次只会读出文件中的一行内容,常用在如果文件内容特别多,文件很大的情况下是哟领,这样不会出现一下子读取全部的文件内容导致资源被占用。
    
    file.readlines():
        读取文件中的所有数据,并将文件中的全部数据存入一个列表进行返回。
        返回的时候如果读取到的每一行文件内容如果有换行,会在数据末尾有一个
    。
    
    注意:这三个方法都是对文件只读取一次,如果下次还想再重新读取文件内容,那就只能关闭文件从头开始读取了。
    
    ========================================================
    
    f.write(info):
        将内容写入文件。
    
    f.close():
        关闭已打开的文件。
        每次对文件进行读写操作完毕之后,都需要关闭文件,否则会占用资源。
    
    
    f.flush():
        刷新缓冲区。直接将缓冲区中的内容直接写入文件中,而不是被动的等待输出缓冲区写入。
        
    
    f.seek(offset[,whence]):
        移动文件读取指针,用于从指定位置读取文件。
        参数解析:
            offset:开始的偏移量。表示需要移动偏移的字节数。如果该参数是负数,则代表从倒数第几位开始进行读写。
            whence:该参数为可选参数,默认值为0。这是为了给offset参数定义一个参数u,表示要从那个位置开始偏移:0代表从文件开头开始偏移;1代表从当前指针位置开始偏移;2代表从文末开始偏移。
            该函数如果操作成功,则返回新的文件位置;如果操作失败,则返回-1。
        注意:传入的offsest参数,所代表的偏移量是从0开始计算的。也就是说如果传入5,那么是从文件的第6个字节数开始读取。
    

    操作文件的进阶写法

    with open("test.txt", mode="r", encoding="utf-8") as f:
        fs = f.read()
        print(fs)
    

    使用这种方法,可以避免在读取文件完毕之后 还需要额外调用close()方法来关闭文件。并且,一旦使用了这种形式来读写文件的话,那么在内部是可以使用循环来直接读取文件的:

    with open("test.txt", mode="r", encoding="utf-8") as f:
        for line in f:
            print(line)
    

    文件读写练习:

    # 修改文件内容
    """
    方法步骤:
    ①.首先引入os模块;
    ②.用r模式打开目标文件,并用w模式打开文件副本。(可以是任意一个文件)
    ③.从目标文件中读取文件内容,并写入副本中。
    ④.在副本中进行文件的修改。
    ⑤.删除目标文件,并将副本文件进行名字修改。
    """
    import os
    with open("素材.txt",mode="r",encoding="utf-8") as f,open("素材_副本.txt",mode="w",encoding="utf-8") as f2:
        for line in f:
            line = line.replace("明月","太阳")
            f2.write(line)
    os.remove("素材.txt")
    os.rename("素材_副本.txt","素材.txt")
    
    # 操作日志文件
    list = []
    with open("日志.log",mode="r",encoding="utf-8") as f:
        first = f.readline().strip().split(",")     # 将日志文件的第一行进行切割,得到一个列表:[id,name,company,country]
        for line in f:                              # 从日志文件的光标处继续读取文件
            dic = {}                                # 创建一个字典
            lst = line.strip().split(",")           # 将读取出来的内容再次进行切割,得到一个列表:[1,英雄联盟,拳头,韩国],[2,DNF,腾讯,中国],[3,反恐精英,Steam,美国]        
            for i in range(len(lst)):               # 根据读取出来的列表的长度,进行循环,并以此创建字典的键值。
                dic[first[i]] = lst[i]
            list.append(dic)                        # 在最外层循环出,将每次创建的字典添加到空列表中
    print(list)
    
  • 相关阅读:
    正则表达式
    HDU 2066 多源最短路
    UVA 11039 模拟
    Concrete Mathematics Chapter 1 Warmups
    List differences between JAVA and C++
    uva 11107Life Forms
    poj 1509 Glass Beads
    poj 3581
    网络流建图
    图论算法----网络流
  • 原文地址:https://www.cnblogs.com/Pilaoban/p/13068983.html
Copyright © 2011-2022 走看看