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)
原文地址:https://www.cnblogs.com/Pilaoban/p/13068983.html