Python文件操作


Python文件操作

课程目标:掌握基于Python对文件相关操作。

image-20211215100356630

image-20211215104228550

image-20211215104259256

image-20211215104448982

image-20211215104627807

image-20211215104645340

image-20211215104700513

image-20211215104717808

image-20211215104733018

image-20211215104744950

基础案例:

# 案例1:用户注册
"""
user = input("请输入用户名:")
pwd = input("请输入密码:")
data = "{}-{}".format(user, pwd)
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
file_object.write(data)
file_object.close()
"""

# 案例2:多用户注册
"""
# w写入文件,先清空文件;再在文件中写入内容。
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
while True:
    user = input("请输入用户名:")
    if user.upper() == "Q":
        break
    pwd = input("请输入密码:")
    data = "{}-{}\n".format(user, pwd)

    file_object.write(data)
file_object.close()
"""

文件操作模式

上文我们基于文件操作基本实现了读、写的功能,其中涉及的文件操作模式:rt、rb、wt、wb,其实在文件操作中还有其他的很多模式。

========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r'       open for reading (default)
'w'       open for writing, truncating the file first
'x'       create a new file and open it for writing
'a'       open for writing, appending to the end of the file if it exists

'b'       binary mode
't'       text mode (default)

'+'       open a disk file for updating (reading and writing)

The default mode is 'rt' (open for reading text).

关于文件的打开模式常见应用有:

  • 只读:rrtrb (用)

    • 存在,读
    • 不存在,报错
  • 只写:wwtwb(用)

    • 存在,清空再写
    • 不存在,创建再写
  • 只写:xxtxb

    • 存在,报错
    • 不存在,创建再写。
  • 只写:aatab【尾部追加】(用)

    • 存在,尾部追加。
    • 不存在,创建再写。
  • 读写

    • r+、rt+、rb+,默认光标位置:起始位置
        file_object = open('info.txt', mode='rt+')

        # 读取内容
        data = file_object.read()
        print(data)

        # 写入内容
        file_object.write("你好呀")

        file_object.close()
        file_object = open('info.txt', mode='rt+')

        # 写入内容
        file_object.write("Tom")

        # 读取内容
        data = file_object.read()
        print(data)  # -123

        file_object.close()
- w+、wt+、wb+,默认光标位置:起始位置(清空文件)
        file_object = open('info.txt', mode='wt+')

        # 读取内容
        data = file_object.read()
        print(data)

        # 写入内容
        file_object.write("你好呀")

        # 将光标位置重置起始
        file_object.seek(0)

        # 读取内容
        data = file_object.read()
        print(data)

        file_object.close()
- x+、xt+、xb+,默认光标位置:起始位置(新文件)

- a+、at+、ab+,默认光标位置:末尾
        file_object = open('info.txt', mode='at+')

        # 写入内容
        file_object.write("hello world!")

        # 将光标位置重置起始
        file_object.seek(0)

        # 读取内容
        data = file_object.read()
        print(data)

        file_object.close()

多用户注册案例:

while True:
    user = input("用户名:")
    if user.upper() == "Q":
        break
    pwd = input("密码:")

    data = "{}-{}\n".format(user, pwd)

    file_object = open('files/account.txt', mode='a')
    file_object.write(data)
    file_object.close()
file_object = open('files/account.txt', mode='a')

while True:
    user = input("用户名:")
    if user.upper() == "Q":
        break
    pwd = input("密码:")
    data = "{}-{}\n".format(user, pwd)
    file_object.write(data)

file_object.close()

常见功能

在上述对文件的操作中,我们只使用了write和read来对文件进行读写,其实在文件操作中还有很多其他的功能来辅助实现更好的读写文件的内容。

  • read,读

    • 读所有【常用】
f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()
f = open('info.txt', mode='rb')
data = f.read()
f.close()
  • 读n个字符(字节)【会用到】
        f = open('info.txt', mode='r', encoding='utf-8')
        # 读1个字符
        data = f.read(1)
        f.close()

        print(data) 
        f = open('info.txt', mode='r',encoding='utf-8')

        # 读1个字符
        chunk1 = f.read(1)
        chunk2 = f.read(2)
        print(chunk1,chunk2)

        f.close()
        f = open('info.txt', mode='rb')

        # 读1个字节
        data = f.read(3)
        f.close()

        print(data, type(data))  # b'\xe6\xad\xa6' <class 'bytes'>
        f = open('info.txt', mode='rb')

        # 读1个字节
        chunk1 = f.read(3)
        chunk2 = f.read(3)
        chunk3 = f.read(1)
        print(chunk1,chunk2,chunk3)

        f.close()
  • readline,读一行
    f = open('info.txt', mode='r', encoding='utf-8')

    v1 = f.readline()
    print(v1)

    v2 = f.readline()
    print(v2)

    f.close()
    f = open('info.txt', mode='r', encoding='utf-8')
    v1 = f.readline()
    print(v1)
    f.close()

    f = open('info.txt', mode='r', encoding='utf-8')
    v2 = f.readline()
    print(v2)
    f.close()
  • readlines,读所有行,每行作为列表的一个元素
    f = open('info.txt', mode='rb')

    data_list = f.readlines()

    f.close()

    print(data_list)
  • 循环,读大文件(readline加强版)【常见】
    f = open('info.txt', mode='r', encoding='utf-8')
    for line in f:
        print(line.strip())
    f.close()
  • write,写
    f = open('info.txt', mode='a',encoding='utf-8')
    f.write("AAAA")
    f.close()
    f = open('info.txt', mode='ab')
    f.write( "hello world!".encode("utf-8") )
    f.close()
  • flush,刷到硬盘
    f = open('info.txt', mode='a',encoding='utf-8')

    while True:
        # 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
        f.write("hello world!")
        f.flush()

    f.close()
    file_object = open('files/account.txt', mode='a')

    while True:
        user = input("用户名:")
        if user.upper() == "Q":
            break
        pwd = input("密码:")
        data = "{}-{}\n".format(user, pwd)
        file_object.write(data)
        file_object.flush()

    file_object.close()
  • 移动光标位置(字节)
    f = open('info.txt', mode='r+', encoding='utf-8')

    # 移动到指定字节的位置
    f.seek(3)
    f.write("hello world!")

    f.close()
注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
  • 获取当前光标位置
    f = open('info.txt', mode='r', encoding='utf-8')

    p1 = f.tell()
    print(p1)  # 0

    f.read(3)  # 读3个字符 3*3=9字节

    p2 = f.tell()
    print(p2)  # 9

    f.close()
    f = open('info.txt', mode='rb')

    p1 = f.tell()
    print(p1)  # 0

    f.read(3)  # 读3个字节

    p2 = f.tell()
    print(p2)  # 3

    f.close()

上下文管理

之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。

以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。

with open("xxxx.txt", mode='rb') as file_object:
    data = file_object.read()
    print(data)

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
    pass