跳到主要内容

内置函数-python文件IO操作

一段简单的文件读写过程:

>>> fp = open("test-dir/test-file.md", "r+")
>>> fp.read()
'Hello World'
>>> fp.write("Enjoy Study")
11
>>> fp.read()
''
>>> fp.flush
>>> fp.close()
>>> fp = open("test-dir/test-file.md", "r")
>>> fp.read()
'Hello WorldEnjoy Study'
>>>fp.close()

打开文件

open()

原型:

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

  • 参数

    file:要打开的文件的路径

    mode:打开方式

    encoding:编码格式

    errors:错误处理方式(ignore表示直接忽略)

  • 返回值

    文件描述符,从当前的位置操作当前打开的文件

打开方式

方式说明
r以只读的方式打开文件,文件的引用(描述符)将会被放在文件开头
rb以二进制格式打开只读文件,文件的引用(描述符)将会被放在文件开头
r+以读写的方式打开文件,文件的引用(描述符)将会被放在文件开头
w以只写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
wb以二进制格式打开只写文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
w+以读写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
a打开一个文件用于追加内容,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件
a+打开一个文件用于读写,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件

打开普通文件

fp = open(path, "r")

打开二进制文件

fp = open(path, "rb")

指定编码格式

fp = open(path, "r", encoding="utf-8")

指定错误处理方式

fp = open(path, "r", encoding="utf-8", errors="ignore")

读操作

read()

fp.read() 读取文件的全部内容

fp.read(num) 读取指定字节数的内容

fp.readline() 读取整行内容(包括\n字符)

fp.readline(num) 读取指定字节数内容

>>> fp = open("test-dir/test-file.md", "r")
>>> fp.readline(10)
'Hello Worl'
>>> fp.read(4)
'dEnj'
>>> fp.read()
'oy Study'
>>> fp.read()
''
>>> fp.close

fp.readlines() 读取所有行并返回一个列表,列表中的元素是每行内容

li = fp.readlines()

读文件完整过程:

try:
fp = open("file.txt", "r")
print(fp.read())
finally:
if fp:
fp.close()

读文件简写方式:

with open("file.txt", "r") as fp:
print(fp.read())

写操作

过程:

  • 找到文件
  • 打开文件
  • 将内容写入缓冲区,此时内容没有写入文件
  • 刷新缓冲区,直接把缓存区中的数据立刻写入文件
  • 关闭文件

刷新缓冲区方式

  • 程序结束
  • 关闭文件
  • 手动刷新
  • 缓冲区满了
  • 遇到\n

找到文件

path = "file.txt"

打开文件

fp = open(path, "w")

将内容写入缓冲区

fp.write("sunck good")

手动刷新缓冲区

fp.flush()

关闭文件

fp.close()

写文件完整过程:

try:
fp = open("file.txt", "w")
fp.write("cool man")
finally:
if fp:
fp.close()

写文件简写方式:

with open("file.txt", "w") as fp:
fp.write("cool man")

关闭文件

  • 注意

    文件使用过后必须关闭

  • 原因

    释放资源,系统能打开的文件个数是有限制的,所以需要释放相应文件的文件描述符

  • 关闭方式

    程序结束自动关闭:程序结束时会释放文件对象的空间,文件会关闭,但是不建议这样来做,最好手动关闭

    手动关闭:调用代码关闭

  • 示例

    fp.close()

编码与解码

1、编码

with open("file.txt", "wb") as fp:
s = "sunck is a good man凯"
s = s.encode("utf-8")
fp.write(s)

2、解码

with open("file.txt", "rb") as fp:
s = fp.read()
s = s.decode("utf-8")
print(s)

3、chardet模块

  • 作用

    使用chardet检测编码,支持检测中文、日文、韩文等多种语言

  • 安装

    pip install chardet

  • 使用

    import chardet

    # 注意:数据量小,猜测的不准
    data = "凯哥是一个好男人".encode("gbk")
    # print(data)

    ret = chardet.detect(data)
    print(ret, type(ret))
    '''
    encoding:表示编码格式
    confidence:表示检测的正确的概率
    language:表示数据的语言
    '''

    '''
    GBK是GB2312的超集,两者是同一种编码
    '''
    info = data.decode(ret["encoding"])
    print(info)

特殊的读写

1、list、tuple、dict、set的文件操作

  • pickle模块

    持久化保存对象,将list、tuple、dict、set等数据序列化存储到文件

    import pickle
  • 存储

    user = {"account": "sunck", "passwd": "666"}
    with open("file.txt", "wb") as fp:
    pickle.dump(user, fp)
  • 读取

    with open("file.txt", "rb") as fp:
    user = pickle.load(fp)
    print(user, type(user))

2、StringIO

  • 作用

    数据的读写不一定都是文件,也可以是内存中读写,StringIO可以在内存中读写字符串

  • 导入

    from io import StringIO
  • fp = StringIO()
    fp.write("sunck is\n")
    fp.write(" a good ")
    fp.write("man!")
    # 获取写入的内容
    print(fp.getvalue())
  • fp.seek(0)
    print(fp.read())
    fp.seek(0)
    print(fp.readline())
    fp.seek(0)
    print(fp.readlines())

注意:文件使用后关闭文件

3、BytesIO

  • 作用

    数据的读写不一定都是文件,也可以是内存中读写,StringIO只能操作字符串,BytesIO可以操作二进制数据

  • 使用

    from io import BytesIO

    fp2 = BytesIO()
    fp2.write("sunck is a nice man".encode("utf-8"))

    fp2.seek(0)
    print(fp2.read().decode("utf-8"))

    fp2.close()