第9.2节 Python的文件打开函数open详解

发布时间:2026/9/7 22:41:26
第9.2节 Python的文件打开函数open详解 一、 引言在着手处理某一个文件之前多数情形下都得先将文件予以打开, 如此方能开展后续操作, 而开展操作所处即借助内置函数open去开启这样一个文件。open函数着实属于一种内置函数, 经由io模块定义而来的函数open乃是此内置函数的同义词这乃是官网里针对io.open函数给出的说明, 原文具体为: “This is an alias for the open() ”。此地的this所指代的乃是io.open, open函数与之相关的常规操作办法, 和C语言当中fopen函数的相似程度是比较高的。二、 函数调用语法及参数释义1. 语法以下是改写后的: 打开文件, 模式设置为读取, 参数值为负一, 参数值为无, 参数值为无, 参数值为无, 参数值为真, 参数值为无。2. 参数说明老猿觉得, open函数里头参数这块儿, file、mode那可是老猿认为重要极了的, 它跟c语言里fopen的参数特别相似, 至于其他参数, 老猿就不详细去说。1)file参数:官网提到这样说明呢: 那里讲file属于一种path - like情况, 表示的是即将去打开的文件所具备的路径, 此路径涵盖绝对路径或者相对于当前工作目录的相对路径, 同时它也能够是要被进行封装的整数类型的文件描述符。那要是它作为文件描述符时, 将会在随着返回的I/O对象关闭的时候也跟着关闭, 不过存在一种情况, 就算不关闭, 除非被设置成False。像那种由open()函数返回的、有着read()方法的对象, 在相关范畴里被统一称作file-like。除去file之外, 它还能够是内存里的字节流, 或是网络流, 又或是自定义流等等。file-like 并不需要从特定的类进行继承, 仅仅只要编写一个read()方法就可以了。举例来说, 就是在内存当中所创建的file-like , 常常被用作临时缓冲。对于刚开始学习的人来讲, 将其领会成能够带有路径的文件名便行了, 要留意要是路径有反斜杠的话, 得在前面再添一个反斜杠, 以此避免被转义, 实际上最佳的方式就是运用原始字符串, 也就是在字符串前面加上字母r。要是属于文件描述符, 那么此文件描述符得是经由os.open打开文件之后返回的那个文件描述符。就文件描述符而言, 老猿会在后续文章里专门进行介绍, 大家呢, 也能够在网上自行查找资料。2)mode文件打开时的读写模式它属于一个可选择的字符串, 其作用在于用来指定打开文件所采用的模式, 而它的默认值是 ‘r’。与之相关的取值以及对应的模式情况如下:老猿这般觉得, 此模式跟 C 语言里的文件模式极为相像, 它主要是经由两种属性组合而形成的。文件具有不同类型, 其被划分成文本文件、二进制文件这两种类别, 这两种类别分别对应模式里的t模式、b模式。与此同时, 在所提及的模式里边, t模式属于缺省模式。操作的类型有读、有写、有追加、有更新模式, 与之对应的模式里有: r、w、a、x、它们各自分别对应: 只读的情况、写的情况、追加写的情况、排它性创建写的情况、更新的情况, 在此之中r模式是缺省的模式w模式在文件存在的时候会截断文件, 从而清空内容, 将文件重置为长度是0的空文件, 在不存在时会创建文件, a模式在文件存在时不会去清空内容, 而在文件不存在时会创建文件, x模式是新加进来的模式, 当一个文件已然存在时, 以x模式去打开就会引发相应状况, 在文件不存在时会创建文件并执行写入。注意, 以上模式, 除追加模式外, 打开文件写入内容时, 在没有指定文件内容写入位置的时候, 那么写入的地方, 都是从文件开头所在位置开始写入, 而且在文件已经存在的状况下, 写入内容会覆盖文件开头对应长度的内容。追加模式写入, 都会追加到文件末尾。更新模式, 事实上就是读写模式, 这个模式对应着模式里的 , 要是在指定了 r 模式的情形下启用更新模式, 那么文件内容是能够进行读写的, 然而 x 模式在文件已经存在的状况下是不可以使用更新模式的。’, ‘r ’还有‘w ’之 间存在着一个重要的差别: 后面这个会截断文件, 可是前面那个却不会这么去做。默认模式是’rt’, 此意味着会把文件当作经过编码的文本, 所以会自动开展解码以及编码, 并且默认运用UTF - 8编码。若要指定别的编码以及错误处理策略, 能够使用关键字参数和。3)是可选择的参数, 被用来进行缓冲策略的设置, 传递0用以关闭缓冲, 此情况仅在二进制模式下被允许, 1用于选择行缓冲, 而这仅在文本模式下才能够生效, 并且大于1的整数要用来标记固定大小块缓冲的大小, 此大小是以字节作为单位的。要是没有给出该参数或者值处于-1的状态, 那么默认的缓冲策略以下面所述的情况为准:。二进制文件会依照固定大小的块实施缓冲, 缓冲区的大小会去尝试底层设备的“块大小”或者采用io.参数所定义的大小, 在诸多系统之上, 缓冲区的长度一般是4096或8192字节。使用行缓冲的是“交互式”文本文件即返回True的文件, 其他文本文件采取上述用于二进制文件的策略。4):在文本模式当中, 要是没有进行指定的话, 那么便会依据平台环境去确定使用本地编码, 而本地编码能够在通过模块之后, 借助.(False)这样的方式来予以获取。二进制文件并不需要对参数进行设置。5)它是一个可选择的 字符串 参数, 此参数用于明确指示怎样对编码以及解码错误予以处理, 鉴于二进制文件没办法指定编码模式, 从而该参数不可在二进制模式里使用。错误的类型包含:。如果因存在编码错误, 进而引发异常, 那默认值None会有相同的效果。哎, 则, 忽略错误, 请注意, 忽略编码那错误, 可能会致使数据丢失。会把替换标记, 如‘?’这样的, 插到存在错误数据的位置那里。有这样一些情况, 会针对不正确的字节 , 将其作为专用区里的代码点 , 代码点的范围是从UDC80到UDCFF。当在写入数据的时候 , 使用那个错误处理程序状况下 , 这些私有代码点会被转回到同样的字节。这事对于处理未知编码的文件而言 , 是具备一定作用的。只有在写入文件的时候才支持, 编码不支持的字符会被替换成相应的XML字符引用#nnn;。• ‘’ 用的反向转义序列替换格式错误的数据。在文件进行写入操作的时候, 使用\N{…}这样的转义序列来对那些不被支持的字符展开替换操作。6)该行控制识别换行符以及换行符读写转换方式所用到的换行符, 它只在文本模式能用, 是None、空字符串’’、’\n’、’\r’、’\r\n’ 和其他合法字符串中的一种, 至于其工作原理是:当从流里读取输入之际, 要是其为 None, 那么便启用通用换行模式。输入之中的行能够以 ‘\n’, ’\r’ 或者 ‘\r\n’ 作为结尾, 而这些行结尾符会被转化成 ‘\n’。要是它是 ‘‘或者引号标识的某一字符串, 那就启用通用换行模式, 不过行结尾会直接返还给访问者。要是它有着任何别的合法值, 那么输入行仅由给定字符串终止, 并且行结尾会返还给文件访问方。所有换行符, 都被用来判断一个文本的行, 是否结束, 差别在于, 关于换行符读取后, 怎样进行转换, 存入到读入的缓冲中句号。倘若换行符属于通用换行模式, 那么, ’\n’, ’\r’ 或者 ‘\r\n’均可当作行结尾。而且, 在读取行这个阶段, 这些符号会被转化成’\n’读进缓冲里。如果在那个地方填入的是空白的字符串, 那么读取这一行的时候, 其处理方式就和平‘\n’, ‘\r’ 或者 ‘\r\n’是一样的, 只不过呢, ‘\n’, ‘\r’ 或者 \r\n’这些表示换行的符号, 不会进行转变, 而是直接按照原本的样子读进缓冲里面去。一, 在把输出写入文件流之际, 要是其为None状态的话那么写入的任何‘\n’字符, 都会被转换成为系统默认的行分隔符os。二、倘若这是‘’或者‘\n’的情况, 是不会进行转换就得直接写入的。三、要是这是任何其他合法值的状况下, 那写入的任何‘\n’字符, 将会被转换成为给定的那个字符串。7)老猿没对这个参数做深入研究, 大约当第一个参数file并非文件名而是用os.open打开的文件描述符时, 在此指定本open函数返回的文件对象关闭后, 相应的文件描述符文件关还是不关, 要是此参数为True就关掉传入的文件描述符, 不然就不关, 第一个参数file是文件名时这个参数没意义。这个参数, 老猿没能完全搞清楚其作用, 老猿猜测存在一种场景能够使用, 那就是, 第一个参数, 是经由外部接口传入的, file是一个文件描述符这一情况, 在这种时候, 为了兼容通过文件名访问的功能, 所以, 需要把它转换为文件对象来进行操作, 并且, 需要借助该参数来保证传入的文件描述符不会被关闭, 从而让外部接口后续能够继续正常运行。8)这个参数, 老猿未曾深入探究, 它属于一个能够被调用的函数, 此函数的目标在于定制自身的文件打开操作函数, 并且这个文件打开操作函数的参数, 乃是open函数的首个参数file以及第二个参数mode, 所返回的值是一个文件描述符, 也就是借由os.open返回的那种类型, 系统默认调用的正是os.open, 故而该参数传递os.open同传递None会产生一样的结果。看起来, 老猿没能彻底搞清楚这个参数到底能起到什么样的作用, 或许是在操作者面临需要对深度进行细致调控, 进而掌控文件访问逻辑的情形下投入使用的。三、 函数返回结果要是文件顺利被打开, open()函数所返回的file类型是由所用模式来决定的。等到以文本模式像‘w’‘r’‘wt’‘rt’这些打开文件时, 其会返回io.的一个子类。当运用缓冲以二进制模式打开文件的时候, 返回的类属于io.的一个子类。具体的类存在多种情况, 在只读的二进制模式当中, 它会返回 io., 在写入二进制以及追加二进制模式之下, 它会返回 io. , 而处于读/写模式时, 它会返回 io. , 当禁用缓冲的时候, 就会返回原始流, 也就是 io. 的一个子类 io. , 对吧。如果该文件不能打开则触发 及相关异常。这一节里面, 详细地介绍了, 那个被称作内置函数的open, 它同时还是io.open的同义词, 讲述了与之相关的调用语法, 以及相关的参数, 然而其中有些内容, 就连老猿都没有能够完全弄明白。老猿跟老猿学!