Python 文件处理

作者: 江洋林澜 | 来源:发表于2018-04-07 20:48 被阅读0次

    文件处理

    常用打开文件方式

    1.读取文件内容, 模式为 'r' 表示读, 这也是打开的默认方式。

    2.如果要创建或者替换文件, 模式为 'w', 表示写。

    3.为现有文件添加内容, 模式为 'a', 表示追加。

    4.如果文件是二进制的, 读写都需要添加 'b'。

    模式可以组合, 比如 rb 就表示读取二进制文件, 更多的模式可以使用 dir 查看 open 函数的文档说明。

    不同模式打开文件的列表:

    模式 描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。也就是说, 新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。也就是说, 新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在, 文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在, 创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。如果该文件不存在, 创建新文件用于读写。

    打开一个文件需要使用 open() 函数建立一个文件对象:

    open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
    

    file: 要访问的文件名称。

    mode: 打开文件的模式, 默认访问文件模式是只读(r)

    buffering: 设置 buffer(取值为 0, 1, >1)。如果 buffering 的值被设为 0, 就不会有寄存。如果 buffering 的值取 1, 访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数, 表明了这就是的寄存区的缓冲大小。如果取负值, 寄存区的缓冲大小则为系统默认。

    encoding: 返回数据的编码格式。

    errors: 报错级别, 一般为 strict, ignore。当取strict的时候, 字符编码出现问题的时候, 会报错, 当取ignore的时候, 编码出现问题, 程序会忽略而过, 继续执行下面的程序。

    newline: 用于区分换行符, 这个参数只对文本模式有效, 可以取的值有 None, '\n', '\r', '', '\r\n'

    closefd: 取值与传入的文件参数有关, 默认情况下为 True, 传入的 file 参数为文件的文件名, 取值为 False 的时候,file 只能是文件描述符, 什么是文件描述符, 就是一个非负整数, 在 Unix 内核的系统中, 打开一个文件, 便会返回一个文件描述符。

    例如:

    f = open('a.txt', 'r') # 以只读方式打开 a.txt
    

    close() 方法

    文件对象的 close() 方法刷新缓冲区里任何还没写入的信息, 并关闭该文件,这之后便不能再进行写入。

    当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

    使用语法如下:

    f = open('a.txt', 'r')
    f.close()
    

    读文件

    读文件的常用方法:

    read(): 一次性读取文件的所有内容。

    read(size): 读取 size 个字节的内容。

    readline(): 逐行读取文本,结果是一个 list(列表)

    readlines(): 一次性地按行读取全部内容, 存入一个 list(列表)

    写文件

    写文件的常用方法:

    write(str): 将 str 写入文件。write()并不会在 str 后加上一个换行符。

    writelines(seq): 把 seq 的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。

    Python File(文件) 其他方法:

    file 对象使用 open() 函数来创建, 下面是一些常用的函数

    函数 作用
    file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
    file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
    file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
    file.next() 返回文件下一行
    file.seek(offset[, whence]) 设置文件当前位置
    file.tell() 返回文件当前位置
    file.truncate([size]) 截取文件, 截取的字节通过size指定, 默认为当前文件位置。

    with-文件上下文管理器

    文件操作可能会出现异常(例如要操作的文件不存在等), 抛出异常会影响 close() 方法正确关闭文件。如果想保证 close() 方法的执行, 可以使用如下方法处理异常:

    try:
        f = open('a.txt', 'r')
        print(f.read())
    finally:
        f.close()
    

    Python 的文件对象支持 with 语法, 上面代码的效果可以用如下代码实现:

    with open('a.txt', 'r') as f:
        print(f.read())
    

    with 上下文管理器在执行完代码块之后, 会自动调用文件对象的 close() 方法, 使用 with ... as ... 语法, 可以更简洁。

    json/pickle 存储 Python 对象

    如果我们需要存储的不是字符串, 而是 Python 内置的数据结构或者是一些自定义的类对象, 这时候就需要通过某种方式将需要存储的 Python 对象转换为字符串或者二进制内容存放, 这个过程叫做 序列化, 从字符串转换成对象叫做 反序列化

    下面是 json 和 pickle 模块完成序列化的简单操作:

    In: import json
    In: import pickle
    
    In: my_dict = {'a': [1, 2, 3], 'b': 123}
    In: json_data = json.dumps(my_dict)
    In: pickle_data = pickle.dumps(my_dict)
    
    In: json_data
    Out: '{"a": [1, 2, 3], "b": 123}'
    
    In: pickle_data
    Out: b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01]q\x02(K\x01K\x02K\x03eX\x01\x00\x00\x00bq\x03K{u.'
    

    将序列化的结果写入文件的操作如下:

    with open('data.json', 'w') as f:
        f.write(json_data)
    
    with open('data.json') as f:
        data = json.loads(f.read()) # loads() 方法反序列化
        print(data)
    

    相关文章

      网友评论

        本文标题:Python 文件处理

        本文链接:https://www.haomeiwen.com/subject/iecuhftx.html