【Python基础入门笔记:文件操作详解】

目录

  • 1. 创建
  • 2. 写入
  • 3. 关闭
  • 4. 读取
  • 5. 定位
  • 6. 其他方法
  • 1. 创建

    Python 使用 open() 函数创建或打开文件,语法格式如下所示:

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

    参数说明如下所示:

  • file:表示将要打开的文件的路径,也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)
  • mode:是一个可选字符串,用于指定打开文件的模式,默认值是 ‘r’(以文本模式打开并读取,同 ‘rt’)。对于二进制写入, ‘w+b’
    模式打开并把文件截断成 0 字节; ‘r+b’ 则不会截断。可选模式如下:
  • 模式	描述
    r		读取(默认)
    w		写入,并先截断文件
    x		排它性创建,如果文件已存在则失败
    a		写入,如果文件存在则在末尾追加
    b		二进制模式
    t		文本模式(默认)
     + 	更新磁盘文件(读取并写入)
    
  • buffering:是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数,则默认缓冲策略的工作方式如下:
  • 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。
    
    “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
    
  • encoding:用于解码或编码文件的编码的名称。
  • errors:是一个可选的字符串,用于指定如何处理编码和解码错误(这应该只在文本模式下使用。不能在二进制模式下使用)。
  • newline:区分换行符,它可以是 None,‘’,‘\n’,‘\r’ 和 ‘\r\n’。它的工作原理:
  • 从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 '\n','\r' 或 '\r\n' 结尾,这些行被翻译成 '\n' 在返回呼叫者之前。如果它是 '',则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
    
    将输出写入流时,如果 newline 为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 '' 或 '\n',则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符将被转换为给定的字符串。
    
  • closefd:如果 closefd 为 False
    并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态;如果给出文件名,closefd 为 True(默认值),否则将引发错误。标准名称包括:
  • 如果存在编码错误,'strict' 会引发 ValueError 异常。 默认值 None 具有相同的效果。
    
    'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
    
    'replace' 会将替换标记(例如 '?' )插入有错误数据的地方。
    
    'surrogateescape' 将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U+DC80到U+DCFF。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。
    
    只有在写入文件时才支持 'xmlcharrefreplace'。编码不支持的字符将替换为相应的XML字符引用 &#nnn;。
    
    'backslashreplace' 用Python的反向转义序列替换格式错误的数据。
    
    'namereplace' (也只在编写时支持)用 \N{...} 转义序列替换不支持的字符。
    
  • opener:可以通过传递可调用的 opener 来使用自定义开启器。 以 txt 格式文件为例,我们不手动创建文件,通过代码方式来创建,如下所示:
  • open('test.txt', mode='w',encoding='utf-8')
    

    执行完上述代码,就为我们创建好了 test.txt 文件。

    2. 写入

    上面我们创建的文件 test.txt 没有任何内容,我们向这个文件中写入一些信息,对于写操作,Python 文件对象提供了两个函数,如下所示:

    函数				描述
    write(str)			将字符串写入文件,返回写入字符长度
    writelines(s)		向文件写入一个字符串列表
    

    我们使用这两个函数向文件中写入一些信息,如下所示:

    wf = open('test.txt', 'w', encoding='utf-8')
    wf.write('Tom\n')
    wf.writelines(['Hello\n', 'Python'])
    # 关闭
    wf.close()
    

    3. 关闭

    上面我们使用了 close() 函数进行关闭操作,如果打开的文件忘记了关闭,可能会对程序造成一些隐患,为了避免这个问题的出现,可以使用 with as 语句,通过这种方式,程序执行完成后会自动关闭已经打开的文件。
    with 语句是一种上下文管理器,当它的代码块执行完毕时,会自动关闭文件。这是推荐的方式,因为它确保文件在使用完毕后被正确关闭,即使发生异常也能保证关闭。如下所示:

    with open('test.txt', 'w', encoding='utf-8') as wf:
        wf.write('Tom\n')
        wf.writelines(['Hello\n', 'Python'])
    

    4. 读取

    之前我们已经向文件中写入了一些内容,现在我们读取一下,对于文件的读操作,Python 文件对象提供了三个函数,如下所示:

    函数			描述
    read(size)		读取指定的字节数,参数可选,无参或参数为负时读取所有
    readline()		读取一行
    readlines()		读取所有行并返回列表
    

    我们使用上面三个函数读取一下之前写入的内容,如下所示:

    with open('test.txt', 'r', encoding='utf-8') as rf:
        print('readline-->', rf.readline())
        print('read-->', rf.read(6))
        print('readlines-->', rf.readlines())
    

    5. 定位

    Python 提供了两个与文件对象位置相关的函数,如下所示:

    函数							描述
    tell()							返回文件对象在文件中的当前位置
    file.seek(offset[, whence])		将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点
    

    下面通过示例对上述函数作进一步了解,如下所示:

    with open('test.txt', 'rb+') as f:
        f.write(b'123456789')
        # 文件对象位置
        print(f.tell())
        # 移动到文件的第四个字节
        f.seek(3)
        # 读取一个字节,文件对象向后移动一位
        print(f.read(1))
        print(f.tell())
        # 移动到倒数第二个字节
        f.seek(-2, 2)
        print(f.tell())
        print(f.read(1))
    

    6. 其他方法

    with open('test.txt', 'r+') as f:
        # 检测文件对象是否连接到终端设备
        print(f.isatty())
        # 截取两个字节
        f.truncate(2)
        print(f.read())
    

    作者:像素检测仪

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python基础入门笔记:文件操作详解】

    发表回复