Pyhon文件IO操作详解


       
       
               

                   
                       
                   
                   

 
 

 

1、文件 IO 常用操作

 

在这里插入图片描述

 

2、文件打开操作

 

2.1 打开命令

 
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 1
 
f = open('c:/users/jiao1/test.txt')
print(f)

Out:
<_io.TextIOWrapper name='c:/users/jiao1/test.txt' mode='r' encoding='cp65001'>
# windows 11 Python Jupyter Notebook 环境
# windows 中使用 codepage 代码页,可以认为每一个代码页就是一张编码表
# windows 11 默认使用的编码表是 cp65001
# windows 10 默认使用的编码表是 cp936,等同于 GBK
# Linux 中默认使用的是 utf-8

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
 

2.2 命令参数

 

2.2.1 路径

 

可以使用绝对路径和相对路径,默认是当前路径。

 

2.2.2 mode

 

在这里插入图片描述

 
  • r 模式

    只读打开文件,如果使用 write 方法,会抛异常
    如果文件不存在,抛出 FileNotFoundError 异常
    • 1
    • 2
  • w 模式

    表示只写方式打开,如果读取则抛出异常
    如果文件不存在,则直接创建文件
    如果文件存在,则清空文件内容
    • 1
    • 2
    • 3
  • x 模式

    文件不存在,创建文件,并只写方式打开
    文件存在,抛出 FileExistsError 异常
    • 1
    • 2
  • a 模式

    文件存在,只写打开,追加内容
    文件不存在,则创建后,只写打开,追加内容
    • 1
    • 2
  • 文本模式 t

    字符流,将文件的字节按照某种字符编码理解,按照字符操作。open 的默认 mode 就是 rt
    • 1
  • 二进制模式 b

    字节流,将文件就按照字节理解,与字符编码无关。二进制模式操作时,字节操作使用 bytes 类型
    • 1
  • + 模式

 
为 r w a x 提供缺失的读或者写功能,但是,获取文件对象依旧按照 r w a x 自己的特征
+ 模式不能单独使用,可以认为它时为前面的模式字符做增强功能的
  • 1
  • 2
 

2.2.3 buffering 缓冲区

 
-1 表示 使用缺省大小 的 buffer
    如果是二进制模式,使用 io.DEFAULT_BUFFER_SIZE 值,默认是 4096 或者 8192 bytes
    如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
   
0,只在二进制模式使用,表示关 buffer
1,只在文本模式使用,表示使用行缓冲,意思就是见到 换行符 就 flush
大于1,用于指定 buffer 的大小

buffer 缓冲区是一个内存空间,一般来说是一个 FIFO 队列,到缓冲区满了或者达到阈值,数据才会 flush 到磁盘

flush()    将缓冲区数据写入磁盘
close()    关闭前会调用 flush()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
 
import io
print(io.DEFAULT_BUFFER_SIZE)

# 8192

  • 1
  • 2
  • 3
  • 4
 

在这里插入图片描述

 

2.2.4 encoding 编码,仅文本模式使用

 

在这里插入图片描述

 

2.2.5 errors

 
  • 编码错误将被捕获
  • None 和 Strict 表示有编码错误将抛出 ValueError 异常;ignore 表示忽略
 

2.2.6 newline

 
  • 文本模式中,换行的转换。可以为 None 空串 ’\r‘ ‘\n’ ‘\r\n’
  • 读文件时,None 表示 ’\r‘ ‘\n’ ‘\r\n’ 都被转换为 ‘\n’;’’ 表示不会自动转换通用换行符;其他合法字符表示换行符就是指定字符,就会按照指定字符分行
  • 写文件时,None 表示 ‘\n’ 都会被替换为系统缺省分隔符 os.linesep;’\n’ 或 ‘’ 表示 ‘\n’ 不替换,其他合法字符表示 ‘\n’ 会被替换为指定的字符
  • newline 缺省为 None, windows 下会把 ‘\n’ 替换为 ‘\r\n’
 
f = open('test.txt', 'wt+')
f.write('a\rb\nc\r\nd')
f.seek(0, 0), f.read(), f.close()

Out:
(0, 'a\nb\nc\n\nd', None)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 
newlines = [None, '', '\n', '\r\n']
for n1 in newlines:
    f = open('test.txt', 'r+', newline=n1)
    print(f.readlines())
    f.close()

Out:
['a\n', 'b\n', 'c\n', '\n', 'd']  # 常见换行符都替换为\n
['a\r', 'b\r\n', 'c\r', '\r\n', 'd']  # ’‘表示什么都不做
['a\rb\r\n', 'c\r\r\n', 'd']  # \n 作为换行符
['a\rb\r\n', 'c\r\r\n', 'd']  # \r\n 作为换行符

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
 

2.2.7 closefd

 
  • 关闭文件描述符, True 表示关闭它。False 会在文件关闭后保持这个描述符。可以使用 fileobj.fileno()查看。

    f = open('test.txt', 'wt+')
    f.fileno(), f.close()

    Out:
    (5, None)

    • 1
    • 2
    • 3
    • 4
    • 5
 

3、文件其他命令

 

3.1 read

 
read(size=-1)
# size 表示读取的多少个字符或字节;负数或者 None 表示读取到 EOF
  • 1
  • 2
 

在这里插入图片描述
在这里插入图片描述

 
readline(size=-1)
# 一行行读取文件内容。size 设置一次能读取行内几个字符或字节
  • 1
  • 2
 

在这里插入图片描述

 
readlines(hint=-1)
# 读取多有行的列表。指定 hint 则返回指定的行数
  • 1
  • 2
 

在这里插入图片描述

 

3.2 write

 
write(s)  # 把字符串 s 写入到文件中并返回字符的个数
writelines(lines)  # 将字符串列表写入文件
  • 1
  • 2
 

在这里插入图片描述

 

3.3 close

 
flush 并关闭文件对象
文件已经关闭,再次关闭没有任何效果
  • 1
  • 2
 

3.4 其它命令

 

在这里插入图片描述

 

4、文件指针

 

文件指针,指向当前字节位置。

 
mode=r                    指针起始在 0
mode=a                    指针起始在 EOF
tell()                    显示指针当前位置
seek(offset[,whence])     移动文件指针位置, offset 偏移多少字节, whence 从哪里开始
    文本模式下:
        1 whence 0 缺省值,表示从头开始,offset 只能正整数
        2 whence 1 表示从当前位置, offset 只能接受 0
        3 whence 2 表示从 EOF 开始,offset 只能接受 0
    文本模式支持从开头向后偏移的方式
        1 whence 为 1,相当于原地不动,所以没什么用
        2 whence 为 2,相当于移动文件指针到 EOF
    seek 是按照字节偏移的
    read 在文本模式是按照字节读取的

    二进制模式下:
        1 whence 0 缺省值,表示从头开始,offset 只能正整数
        2 whence 1 表示从当前位置, offset 可正可负
        3 whence 2 表示从 EOF 开始,offset 可正可负
    二进制模式支持任意起点的偏移,从头/从尾/从中间位置开始
    向后 seek 可以超界,但是向前 seek 的时候,不能超界,否则抛异常

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
 

在这里插入图片描述
在这里插入图片描述

 

在这里插入图片描述

 

5、上下文管理

 
  • 使用 with...as... 关键字
  • 上下文管理的语句块并不会开启新的作用域
  • with语句块执行完的时候,会自动关闭文件对象
  • 可参考以下示例:
    在这里插入图片描述
  • 对于类似于文件对象的 IO 对象,一般来说都需要在不使用的时候关闭 注销 以及 释放资源
  • IO 被打开的时候,会获得一个文件描述符。计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机的资源不要被完全耗尽,计算机资源是共享的,不适宜独占的
  • 一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题
 

6、其它课堂笔记(描述不尽准确)

 
# Linux 建议使用 pyenv Python多个版本管理器
# utf-8 一个汉字占三个字节
# cp936 code page 936 可以理解为 gbk 编码表
# Linux 默认编码 utf-8
# Windows 10 默认编码 GBK
# Windows 11 默认编码 utf-8
# w 只写模式 一定会从一张白纸开始写
# r 只读模式
# x 要求文件不存在,即创建一个全新文件,只写模式
# a 只写模式,追加模式;如果文件不存在,会创建文件(EOF 追加写)
# 二进制一定要考虑编码格式
# ascii 0 和 str 0 注意区别
# 二进制模式只认字节,注意和文本模式的区别
# seek 是按照字节来进行的,文本模式慎用 seek
# seek 左边界不可超,右边界可以超
# seek 和 read 操作 可以导致内存中的数据写入到磁盘
# seek 和 tell 操作 都是和字节相关的,与字符无关
# buffer 其实更像一个队列 Queue 缓冲区 FIFO
# cache 解决反复查询/解决重复计算
# rb+ buffering=0
# \x00 == ascii 0 == NUL , print 无法显示
# 磁盘适合一批批处理数据,不能一个个进行处理
# buffering=0 只能二进制
# buffering=1 文本模式,行缓冲,遇到换行符(\n)写入数据(二进制也能使用,但是没啥用)
# buffering>1 文本模式下 和缓冲区大小有关系,与进行的buffering值没关系
# buffering>1 二进制模式下 buffering的值就是缓冲区大小
# 二进制模式和编码无关,文本模式时一定要注意编码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

               

               
               
       

你可能感兴趣的:(python,人工智能)