本系列将从四个部分简单介绍Python对文件系统的操作与支持:

  1. Python内置的 file 对象

  2. Python的os模块对文件、文件系统操作的支持

  3. Python的os.path模块对文件系统操作的支持

  4. Python对文件描述字操作的支持

  5. Python的stat模块

  此外,Python中还有支持临时文件、目录的tempfile模块,支持多个文件操作的fileinput模块,只对文件中部分行进行快速操作的linecache模块,支持常驻内存的 file-like 对象的StringIO和cStringIO(Python 3中替换为io.StringIO和io.BytesIO)模块。以及支持文件、目录间比较的 filecmp 模块等。

  处理文件压缩格式的模块还包括:gzip、bz2、zipfile(使用InfoZip的free zlib库实现,支持跨程序兼容)和zlib(不支持跨程序兼容)等,支持文件打包操作的模块有tarfile等。

一、file对象与open()函数

  file对象是Python内置的数据类型,通过Python内置的open()函数打开文件可以获得一个file对象。

1. open()函数

  open()函数的格式如下:

open(filename, mode='r', bufsize=-1)

  open()返回一个file对象,它是Python内置的file类型的一个实例。

  open()函数各个参数的含义如下:

  • filename:格式:字符串。含义:要打开的文件的路径,可以绝对路径,也可以是相对路径。注意,在Unix和Windows上,都可以使用斜杠“/”作为目录的分隔符。在Windows中,路径分隔符是反斜杠“\”,这与正则表达式中的转义符号相同,因此windows文件路径中需要使用"\\"表示目录,如:'c:\\test\\test.txt',或使用Python中的raw string,如 r'c:\test\test.txt',来表示路径,Linux中则无此要求。
  • mode:格式:字符串。含义:以哪种读写模式打开文件。mode的可选项见下文。
  • bufsize:格式:整型。含义:为文件设置的缓存。bufsize=0时,等价于unbuffer形式,写到文件的内容立即被刷到硬盘;bufsize=1时,表示行缓冲,每一次写入"\n"后,内容就被刷到硬盘。bufsize < 0时,使用系统默认的缓冲大小;bufsize > 1时,使用其作为文件的缓冲大小。

2. 参数mode的取值与含义

  'r' —— 只读模式,要求目标文件必须存在。

  'w' —— 只写模式,如果目标文件已存在,将会截断目标文件并覆盖其内容;如果目标文件不存在,则新建之。

  'a' —— 追加模式,只写打开目标文件,如果目标文件已存在,写入的内容追加到源文件的结尾;如果目标文件不存在,则创建之。

  'r+' —— 读写模式,要求目标文件必须存在,此时写入,并不会截断源文件,而是替换源文件中相应位置的内容。

  'w+' —— 读写模式,如果目标文件已存在,将会截断目标文件并覆盖其内容;如果目标文件不存在,则新建之。

  'a+' —— 追加模式,读写打开目标文件,如果目标文件已存在,写入的内容追加到源文件的结尾;如果目标文件不存在,则创建之。

二进制文件与文本文件

  上面的6中文件打开模式,还可以与'b','t'相结合,组成类似'rb'、'wt'这样的形式,'b'代表二进制模式,'t'代表文本模式。默认情况下,Python以文本模式打开目标文件。

  • Unix平台上,二者没有区别,
  • Windows平台上,如果以文本模式打开文件,当每次遇读到os.linesep (实际上是'\r\n')时,返回'\n',当每次写入"\n"时,实际转换成 os.linesep。

3. 文件的顺序与非顺序访问

  文件本质上是顺序的,想要读取后面的内容,一般就需要先读出前面的内容,同时后面的字节也不会在前面的字节之前被读取。但是文件也支持非顺序的读写方式,file对象记录一个它自己的当前位置,下一次的读写将从这个位置开始。通过f.tell()函数可以查看当前的位置,通过f.seek()函数则可以设置文件当前的位置。

二、file对象的属性、方法

f.closed

只读属性,判断f.close()是否已经调用过。

f.encoding

只读属性,文件的encoding格式

f.mode

只读属性,显示调用open()打开文件时指定的mode

f.name

只读属性,显示调用open()文件时的指定名称

f.newlines
f.softspace

只读的布尔属性,供print语句记录自己的状态,file对象自身并不修改或使用该属性。

f.errors
f.close()

关闭已经打开的file对象,所有的file对象,完成读写操作后,都应该关闭

f.flush()

手动将Python写到文件的缓存刷到操作系统

f.isatty()

如果 f 是一个交互终端,则返回True,否则,返回False

f.fileno()

返回一个整数,这个整数就是文件 f 的文件描述字——file descriptor,fd。

f.read(size = -1)

读取文件内容,以字符串的形式返回。

size < 0 —— 一直读到文件结尾;

size > 0 —— 读取 size 字节的内容直到文件结尾,如果到了文件末尾仍未满 size 字节,则返回全文。

size = 0 —— size = 0 或读取时当前文件的位置在文末,都会返回一个空字符串。

f.readline(size = -1)

读取1行,直到遇见'\n'或读满size字节,以字符串的形式返回。

size >= 0,读取的内容不超过size字节,如果没有读够 size 字节就到本行结尾,则停止读取,返回本行。

size < 0,读取当前一行的全部内容,直到遇到 '\n' 或文件结尾。

f.readlines(size = -1)

读取多行,返回一个list,每一行作为 list 中的一个字符串。最后一个字符串可能不以 “ \n ”结尾。

f.next()

file对象是可迭代的,每次迭代返回文件中的一行。

f.seek(pos, how = 0)

将当前文件的位置设置到距离参考点pos字节的位置,参数 how 决定参照点的位置:

how = 0,参照点是文件开头,这是默认情形,对应于 os.SEEK_SET

how = 1,参考点是当前位置,对应于os.SEEK_CUR

how = 2,参考点是文末,对应于os.SEEK_END

f.tell()

返回文件当前位置距离文件开头的字节数。

f.truncate([size])

将文件截断到不超过 size 字节,

如果size超过当前文件大小,将以0填充,

如果没有提供size参数,则使用 f.tell() 作为截断后新文件的大小。

f.write(s)

将字符串 s 写入到文件中

f.writelines(lst)

参数lst是一个可迭代对象,将其中的字符串内容全部写到 f 中,该函数不会自动添加 '\n' !

可迭代的file对象  

  前面已经提到,file对象是可迭代的,

for line in f:
...

  会依次遍历 f 中的每一行。

file-like对象与多态

  Python中存在file-like对象这个概念,意思是具有file对象部分属性与功能的对象,file-like对象需要实现哪些方法取决于调用它们的client-code,比如它们是只读的,那就可以只实现file对象的读操作,如read()函数等,file-like是只实现file对象功能的某个子集的对象。

(原创)Python文件与文件系统系列(1)—— file 对象的更多相关文章

  1. (原创)Python文件与文件系统系列(4)——文件描述字操作

    文件描述字(file descriptor,fd)是系统中用来唯一记录当前已经打开的文件的标识号,fd是一个整数. 除了file对象外,Python还提供对fd的操作,对fd的操作更加底层,fd和Py ...

  2. (原创)Python文件与文件系统系列(3)——os.path模块

    os.path 模块实现了一些操作路径名字符串的函数,可以通过 import os.path 使用该模块,不过即使仅仅 import os 也可以使用该模块的方法. 1. abspath(path) ...

  3. (原创)Python文件与文件系统系列(5)——stat模块

    stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数返回的 st_result 类型的对象. 通常使用 os.path.is*() ...

  4. (原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持

    os模块的功能主要包括文件系统部分和进程管理部分,这里介绍其中与文件系统相关的部分. 当请求操作系统执行操作失败时,os模块抛出内置异常 exceptions.OSError 的实例,可以通过 os. ...

  5. Python 读写文件和file对象(转)

    1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.txt ...

  6. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  7. 22_java之File对象

    01IO技术概述 * A:IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这 ...

  8. 21_java之File对象和递归遍历

    01IO技术概述 * A:IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这 ...

  9. File对象的常用方法

    File对象不仅可以表示文件,还可以表示目录,源码注释是这么说的:An abstract representation of file and directory pathnames. File类最常 ...

随机推荐

  1. Prism中命令可用性无法自动刷新

    http://stackoverflow.com/questions/2444927/wpf-prism-canexecute-method-not-being-called It is most l ...

  2. [HAOI2016]食物链

    OJ题号:BZOJ4562.洛谷3183 思路:记忆化搜索. 本体可以转化成“求有向图中入度为0的结点到出度为0的结点的路径数”. 每次加边时记录每个结点的入度和出度,然后从入度为0的结点开始搜索,搜 ...

  3. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  4. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  5. zabbix 触发器

    概观 项目只收集数据.要自动评估传入数据,我们需要定义触发器.触发器包含一个表达式,该表达式定义数据的可接受级别的阈值. 如果这一级别超出了传入的数据,触发器将“ fire 触发”或进入“' Prob ...

  6. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  7. 微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程

    转:https://segmentfault.com/a/1190000004594385 项目中涉及保存微信的nickname,之前一直正常使用,但是突然遇到一个之前没有遇到的问题.经过调试发现错误 ...

  8. .NET 开源开发项目【翻译】

    原文地址 本文列出了 .NET 开源开发项目(open source developer projects).意在包括对开发过程的所有方面有所帮组的项目.对于消费项目(consumer project ...

  9. virtualbox centos安装增强工具和Centos与VirtualBox共享文件夹设置

    VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox  在虚拟机中安装 CentOS 之后,不能直接运行安装好 Virtual ...

  10. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    SpringBoot项目编译成功,启动报错 提示信息很明显,通过查看依赖关系,可以找到原因 导致这个问题的原因是因为,在 pom.xml 配置文件中,配置了数据连接技术 spring-boot-sta ...