Python——文件与文件系统

一、 file对象与open()函数

  三个参数的介绍

  二进制与文本文件

  缓冲

  文件的有序和无序访问

二、file对象的属性、方法

  file对象是可以迭代的

  file-like对象

三、文件系统操作

四、fd操作

一、file对象与open()函数

  file对象是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对象功能的某个子集的对象。

三、文件系统操作

  os模块的功能主要包括文件系统部分和进程部分,这里介绍其中与文件系统相关的部分。

  当请求操作系统失败时,os模块返回内置异常 exceptions.OSError 的实例,可以通过 os.error 访问这个类型,OSError的实例有三种属性:

  • errno:操作系统错误的错误代码
  • strerror:描述错误的字符串;
  • filename:操作在哪个文件上出错。

os模块提供的有用属性

>>> os.curdir‘.‘

  表示当前目录的字符串,Unix和Windows上都是“.”。

>>> os.pardir
‘..‘

  表示父目录的字符串,Unix和Windows上都是“..”。

>>> os.defpath
‘.;C:\\bin‘

  程序的默认搜索路径,如果缺乏PATH环境变量时使用。

>>> os.linesep
‘\r\n‘

  文本行的结尾字符串,Unix上是‘\n‘,Windows上是‘\r\n‘。

>>> os.linesep
‘\r\n‘

  分隔文件的扩展名和文件名的分隔符,Unix和Windows上都是“.”。

>>> os.pathsep
‘;‘

  路径列表中用来分隔路径的分隔符,可以参考PATH环境变量,Unix平台上是“:”,Windows平台上是";"。

>>> os.sep
‘\\‘

  路径组成的分割符,在Unix平台上是"/",Windows平台上是"\\"。

os模块提供的与文件系统相关的方法

os.access(path, mode)
# e.g.
>>> os.access("C:\Windows\System32", os.R_OK | os.W_OK)
True

  access()函数判断当前进程的真实用户(组)(real user / real group)是否具有对路径 path 执行所有 mode 中列出的操作的权限,参数mode的可选值包括:

  • os.F_OK:路径指定的文件是否存在;
  • os.R_OK:路径指定的文件是否可读;
  • os.W_OK:路径指定的文件是否可写;
  • os.X_OK:路径指定的文件是否可执行;
os.chdir(path)# e.g.>>> os.chdir("c:/")

  等于 cd 到路径path,即將pwd切換到 path 指定的路径。

os.chmod(path, mode)

  将 path 的访问权限设置为mode ,mode 可以是0或多个 os.R_OK,os.W_OK,os.X_OK,也可是3位8进制的整数(Unix平台),如 0777, 0664等。

os.getcwd()
#e.g.
>>> os.getcwd()
‘c:\\‘

  getcwd()获取当前工作目录的路径。

os.listdir(path)

  listdir(path) 返回一个列表,列表中包括 path 路径下的所有文件和目录,但是不包括“.”和“..”目录。

  listdir()返回的列表是未排序的。

os.mkdirs(path, mode=0777)
os.mkdir(path, mode=0777)

  创建一个目录,此时 path 可能涉及多级目录,mkdirs会创建沿路所有尚不存在的目录,然后设置访问权限;而 mkdir()只创建 path 最右端的 基地址,基地址前面如果存在尚未创建的目录,mkdir()会抛出异常OSError。

  创建失败时两个函数都抛出OSError,当指定的路径已经存在时也抛出相同的异常。

os.remove(path)
os.unlink(path)

  这两个函数删除 path 指定的文件。

os.removedirs(path)

  把 path 中经过的所有目录(要求是空的目录)都删除。

os.rmdir(path)

  删除 path 指定的目录(要求目录为空),删除失败时抛出OSError,例如删除的目录非空。

os.rename(src, dest)

  将文件或目录 src 重命名为 dest。

os.renames(src, dest)

  重命名,但是重命名的过程中会自动创建参数 dest 中所有的尚不存在的中间路径,重命名后会删除 src 中包含的空目录。

os.stat(path)

  返回一个 stat_result 类型的值,该值提供了 10 种关于参数 path 的信息,可以通过对应的属性访问这些信息,例:

1 >>> os.path.getsize(‘test1.py‘)
2 0L
3 >>> os.stat(‘test1.py‘).st_size
4 0L

  这10种关于文件、目录的信息及其对应的属性名称分别为:

属性名 含义
st_mode 访问控制与其他模式位
st_ino I节点的序号
st_dev 设备号
st_nlink 硬链接数
st_uid 属主的UID
st_gid 属主的GID
st_size 大小(单位:字节)
st_atime 最后访问时间(自epoch以来的秒数)
st_mtime 最后修改时间
st_ctime 最后一次状态改变的时间
os.utime(path, times=None)

  设置文件的最后访问和最后修改时间,

  • 如果 times 是None,则utime()使用当前的时间;
  • 如果 times 不为None,则 times 必须是一个二元组——(accessed, modified),即指定最后访问和修改的时间,这里这两个值都要是自 epoch 以来的秒数。
os.walk(top, topdown=True, onerror=None)

  首先,这个函数是一个生成器!用来遍历参数 top 指定的目录

  • 当参数 topdown 为True(默认情形)时,从 top 向其子目录遍历
  • 当参数 topdown 为False时,倒序从 top 目录树的叶节点开始,反向遍历

  参数 onerror :

  • 如果是None,则walk()忽略遍历过程中遇到的一切OSError异常
  • 否则必须是一个函数,以异常OSError的实例为唯一的参数,一旦walk()遇到异常,就将其传递给 onerror()函数,onerror()可以自由定义。

  walk() 每次生成的 item 都是一个三元组——(dirpath, dirnames, filenames),其中:

  • dirpath:当前遍历到的目录的名称;
  • dirnames:列表,包含当前目录的所有直接子目录名(不包括 "." 和 "..");
  • filenames:列表,包含当前目录中的所有文件名;

例:

import os
for dirpath, dirnames, filenames in os.walk("d:\\programs"):
    dirnames[:] = [ d for d in dirnames if not d.startswith(‘.‘) ]
    for name in filenames:
        print os.path.join(dirpath, name)

  该例子将会打印出”d:\\programs“目录下,所有不以 “.” 开头的目录中的所有文件,

  注意在 topdown 为True时,遍历到一层目录时,修改生成得到的dirnames列表,可以影响下一层将要遍历的子目录个数和顺序,比如这里就在遍历时剔除了以“.”开头的目录。

时间: 2024-11-08 02:25:54

Python——文件与文件系统的相关文章

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

文件描述字(file descriptor,fd)是系统中用来唯一记录当前已经打开的文件的标识号,fd是一个整数. 除了file对象外,Python还提供对fd的操作,对fd的操作更加底层,fd和Python中的file对象是不同的概念.在介绍file对象时已经提过,调用 f.fileno() 可以获得一个文件对象的fd,也可以在一个已有的 fd 上在封装一个 file 对象:f = os.fdopen(fd). 一些 fd 是一个进程创建时事先分配好的: 0——进程的stdin 1——进程的s

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

三.文件系统操作 os模块的功能主要包括文件系统部分和进程部分,这里介绍其中与文件系统相关的部分. 当请求操作系统失败时,os模块返回内置异常 exceptions.OSError 的实例,可以通过 os.error 访问这个类型,OSError的实例有三种属性: errno:操作系统错误的错误代码 strerror:描述错误的字符串: filename:操作在哪个文件上出错. os模块提供的有用属性 >>> os.curdir'.' 表示当前目录的字符串,Unix和Windows上都是

Python文件与文件系统系列(5)——stat模块

stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数的结果. 通常使用 os.path.is*() 这类函数来测试一个文件的类型,这些方法对同一个文件进行多次测试时,stat()系统调用都是不可避免的开销.同时,有些信息是os.path.is*() 这类函数无法提供的,例如检测是否是块设备.字符设备等. 此时就可以使用 stat 模块及stat模块中的诸多功能,下面是一个例子: import os, sys import sta

python文件相关操作

Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中,open()方法进行打开文件等相关操作,open()方法其中第一个参数是要打开的文件的文件路径,第二个参数是对要打开文件要执行的权限,第三个参数是文件采用字符编码. 而open()方法返回的内容叫做文件句柄.我们可以打印返回的文件句柄来看下: f = open('test_file.txt','r

Python文件和目录操作实例代码

对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这些函数无论是在Unix.Windows还是Macintosh平台上,它们的使用方式是完全一致的. 本文将详细解释这些函数的使用方法.首先,介绍Python语言中类似于Windows系统的dir命令的列出文件功能,然后描述如何测试一个文件名对应的是一个标准文件.目录还是链接,以及提取文件大小和日期的方法.之后,还将介绍如何删除文件和目录

Python 文件IO

Python 文件I/O 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: #!/usr/bin/python # -*- coding: UTF-8 -*- print ("Python 是一个非常棒的语言,不是吗?") 你的标准屏幕上会产生以下结果: Python 是一个非常棒的语言,不是吗? 读取键盘输入 在Python2提供了两个内置函数从标准输入读入一行文本,默

Python文件操作 I/O

Python 文件 I/O(输入/输出)是比较乏味的事情,因为看不到明显的运行效果,但 I/O 是所有程序都必需的部分,使用输入机制,允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据),用户输入数据:使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中: Python 提供有非常丰富的文件 I/O 支持,它既提供了 pathlib 和 os.path 来操作各种路径,也提供了全局的 open() 函数来打开文件(在打开文件之后,程序既可读取文件的内容,也可向文件输出

如何编写一个带命令行参数的Python文件

看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命令行参数. 首先你要知道python中的sys模块的一些功能: import sys print "the number of python program's argument:",len(sys.argv) print "the value of every argument

Python文件类型

Python的文件类型分为三种:源代码.字节代码.优化代码. 1. 源代码    Python源代码文件,即py脚本文件,由 python.exe 解释,可在控制台下运行.pyw脚本文件是图形用户接口(Graphical user interface)的源文件,专门用来开发图形界面,由 pythonw.exe 解释运行. 2. 字节代码    Python源文件经过编译后生成的pyc文件,即字节文件.它与平台无关,所以可以移植到其他系统上.下面这段脚本可以把 example.py 编译为 exa