Python学习笔记9:Python文件和输入输出

1、文件对象

  • 普通的磁盘文件。
  • 其他类型抽象层面上的“文件”。
  • 具有文件类型接口的其他对象(类文件(file like)对象)。

内建函数open()返回一个文件对象。
还有大量的函数也会返回文件对象或是类文件对象。

2、文件内建函数
(1)open()函数
提供初始化输入/输出(I/O)操作的通用接口。
成功打开文件返回文件对象,否则引发错误,产生IOError异常。

file_object = open(file_name,access_mode='r',buffering=-1)

file_name代表要打开的文件的名字,可以是相对路径或者绝对路径;
access_mode代表文件的打开模式,默认采用’r’,完整取值:

  • ‘r’:读取已经存在的文件
  • ‘w’:写入,文件存在先清空再创建,不存在则创建
  • ‘a’:追加数据到文件的末尾,若文件不存在则创建
  • ‘rU’或’U’:以读方式打开,同时提供通用换行符支持。
  • ‘b’:二进制模式访问,所有POSIX兼容的Unix系统(含Linux),’b’可有可无,因为这些系统中所有文件都被当成二进制文件。加上’b’对于将程序移植到非Unix环境是有好处的,但是’b’不能作为第一个字符出现。
  • ‘rb’:以二进制读模式打开。
  • ‘wb’:以二进制写模式打开。
  • ‘ab’:以二进制追加模式打开。
  • ‘+’:可读可写
  • ‘r+’:以读写模式打开。
  • ‘w+’:以读写模式打开。
  • ‘a+’:以读写模式打开。
  • ‘rb+’:以二进制读写模式打开。
  • ‘wb+’:以二进制读写模式打开。
  • ‘ab+’:以二进制读写模式打开。

buffering代表访问文件所采用的缓冲方式,取值:

  • 0:不缓冲
  • 1:只缓冲一行数据
  • >1:使用给定值作为缓冲区大小
  • 不给定或者使用负数,表示采用系统默认缓冲机制,即对任何类电报机(tty)设备使用行缓冲,其他设备使用正常缓冲。

(2)工厂函数file()
open()与file()可以任意替换。
(3)通用换行符支持(UNS)(2.3)
当你使用’U’标志打开文件的时候,所有的行分隔符(或行结束符)通过Python的输入方法(例如read*())返回时都会被替换为换行符NEWLINE( \n)。这个特性还支持包含不同类型行结束符的文件。文件对象的newlines属性会记录它曾“看到的”文件的行结束符。UNS只用于读取文本文件,没有对应的处理文件输出的方法。

3、文件内建函数
(1)输入

  • read()方法直接读取字节到字符串中,最多读取给定数目个字节。 若没有给定size参数(默认为-1)或size为负值,文件将读到末尾。
  • readline()读取一行,包括行结束符。size默认为-1,代表读至行结束符。否则在超过size个字节后会返回不完整的行。
  • readlines()返回字符串列表。可选参数sizhint代表返回的最大字节大小。若大于0,那么返回的所有行应该大约有sizhint字节。
  • xreadlines对象(2.1),在xreadlines模块中,该对象类型可以用来高效地迭代文件的行。调用file.xreadlines()等价于xreadlines.xreadlines(file)。xreadlines不是一次性读取所有的行,而是每次读取一块,所以用在for循环时可以减少对内存的占用。2.3中的迭代器和文件迭代的引入,没必要使用xreadlines()方法,因为它和iter(file)及for eachLine in file效果一样。
  • readinto()已废弃。buffer()已废弃。读取给定数目的字节到一个可写的缓冲区对象。

(2)输出

  • write()将含有文本数据或二进制数据块的字符串写入到文件中去。
  • writelines()接受一个字符串列表写入文件。行结束符不会自动加入,必须在调用writelines()前给每行结尾加上行结束符。

(3)文件内移动

  • seek(off,whence=0)方法在文件中移动文件指针到不同的位置。
    offset字节代表相对于某个位置(由whence指定)偏移量。默认位置值为0,代表从文件开头算起(即绝对偏移量),1代表从当前位置开始,2代表从文件末尾算起。
  • tell()方法它告诉你当前文件指针在文件中位置,从文件起始算起,单位为字节。

(4)文件迭代

for eachLine i n f:
    :

eachLine表示文本文件的一行(包括末尾的行结束符)。
2.2前,最好使用file.readlines()来读取所有数据,后使用file.xreadlines()来作为最高效读取文件的方法。2.2中引入的迭代器和文件迭代使文件迭代更高效。file.next()方法返回文件的下一行,或在没有其他行时引发StopIteration异常。
(5)其他

  • close()关闭文件。Python垃圾收集机制也会在文件对象的引用计数降到0时自动关闭。良好的编程习惯要求在重新赋给另一个文件对象前关闭这个文件。不显式关闭文件,可能会丢失输出缓冲区的数据。
  • fileno()返回打开文件的描述符。返回一个整型。 flush()方法直接把内部缓冲区中的数据立刻写入文件。
  • isatty()当文件是类tty设备返回True,否则返回False。
  • truncate()方法将文件截取到当前文件指针位置或者到给定size,以字节为单位。

(6)文件方法杂项
①行分隔符

  • POSIX(Unix系列或Mac OS X)系统,行分隔符是换行符NEWLINE(\n)字符。
  • 旧的Mac OS下是RETURN(\r)
  • 而DOS和Wind32使用(\r\n)。

②路径分隔符

  • POSIX使用“/”;
  • DOS和Windows使用“\”;
  • 旧版本Mac OS使用“:”。

③有助于跨平台开发的os模块属性

  • linesep 用于在文件中分隔行的字符串
  • sep 用于分隔文件路径名的字符串
  • pathsep 用于分隔文件路径的字符串
  • curdir 当前工作目录的字符串名称
  • pardir (当前工作目录的)父目录字符串名称

④其他补充
print语句默认在输出内容末尾加上一个换行符,在语句后加一个逗号就可以避免这个行为。
readline()和readlines()不对行里空字符做任何处理,所以使用print时有必要加上逗号,若省略逗号,显示出的文本每行后会有两个换行符。

4、文件内建属性

  • file.closed 文件已经被关闭标志位
  • file.encoding 文件所使用的编码
  • file.mode 文件打开时使用的访问模式
  • file.name 文件名
  • file.newlines 行分隔符列表
  • file.softspace 0表示在输出一数据后,加上一个空格符;1表示不加(程序员一般用不着,程序内部使用)

5、标准文件
程序执行后,可以访问3个标准文件。

  • 标准输入(一般是键盘)
  • 标准输出(到显示器的缓冲输出)
  • 标准错误(到屏幕的非缓冲输出)

“缓冲”和“非缓冲”指open()函数的第三个参数。
这些文件分别为stdin,stdout,stderr。
这些文件预先会被打开,通过sys模块可以访问到这些文件的句柄。
print语句通常是输出到sys.stdout;而内建函数raw_input()通常从sys.stdin 接收输入。

6、命令行参数
sys模块通过sys.argv属性提供了对命令行参数的访问。

  • sys.argv命令行参数的列表,该列表的第一项永远是程序的名称。
  • len(sys.argv)命令行参数的个数(即C语言的argc)

“管道”实现一个程序的输出到下个程序输入的转换。
Python提供了模块getopt(简单)及optparse(复杂)来辅助处理命令行参数。

7、文件系统
大多通过os模块访问文件系统。该模块是Python访问操作系统功能的主要接口。
os模块实际上只是真正加载的模块的前端,那些真正的模块可能是:posix,nt(win32),mac(旧版本的Mac OS),dos(DOS),OS2(OS/2)等等。
os模块负责大部分文件系统操作,包括删除/重命名文件,遍历目录树,以及管理文件访问权限等。os模块还负责对进程和进程运行环境进行管理。
另外,os.path模块可以完成一些针对路径名的操作。可以完成管理和操作文件路径的各个部分,获取文件或子目录信息,文件路径查询等。
os模块与os.path模块提供了与平台和操作系统无关的统一的文件系统访问方法。
(1)os模块的文件/目录访问函数

  • mkfifo()/mknod() 创建命名管道/创建文件系统节点
  • remove()/unlink() 删除文件
  • rename()/renames() 重命名文件
  • *stat() 返回文件信息
  • symlink() 创建符号链接
  • utime() 更新时间戳
  • tmpfile() 创建并打开(’w+b’)一个新的临时文件
  • walk() 生成一个目录树下的所有文件名
  • chdir()/fchdir() 改变当前工作目录/通过一个文件描述符改变当前工作目录
  • chroot() 改变当前进程的根目录
  • listdir() 列出指定目录的文件
  • getcwd()/getcwdu() 返回当前工作目录/功能相同,但返回一个Unicode对象
  • mkdir()/makedirs() 创建目录/创建多层目录
  • rmdir()/removedirs() 删除目录/删除多层目录
  • access() 检验权限模式
  • chmod() 改变权限模式
  • chown()/lchown() 改变owner和group ID/功能相同,但不会跟踪链接
  • umask() 设置默认权限模式
  • open() 底层的操作系统open(对于文件,使用标准的内建open()函数)
  • read()/write() 根据文件描述符读取/写入数据
  • dup()/dup2() 复制文件描述符/功能相同,但是是复制到另一个文件描述符
  • makedev() 从major和minor设备号创建一个原始设备号
  • major()/minor() 从原始设备号获得major/minor设备号

(2)os.path模块中的路径名访问函数

  • basename() 去掉目录路径,返回文件名
  • dirname() 去掉文件名,返回目录路径
  • join() 将分离的各部分组合成一个路径名
  • split() 返回(dirname(),basename())元组
  • splitdrive() 返回(drivename,pathname)元组
  • splitext() 返回(filename,extension)元组
  • getatime() 返回最近访问时间
  • getctime() 返回文件创建时间
  • getmtime() 返回最近修改时间
  • getsize() 返回文件大小(以字节为单位)
  • exists() 指定路径(文件或目录)是否存在
  • isabs() 指定路径是否为绝对路径
  • isdir() 指定路径是否存在且为一个目录
  • isfile() 指定路径是否存在且为一个文件
  • islink() 指定路径是否存在且为一个符号链接
  • ismount() 指定路径是否存在且为一个挂载点
  • samefile() 两个路径名是否指向同一个文件

8、永久存储模块
pickle和marshal模块用来转换并储存Python对象。数据的扁平化,数据的序列化或者数据的顺序化。
另一些模块(dbhash/bsddb,dbm,gdbm,dumbdbm等)及它们的“管理器”(anydbm)只提供了Python字符串的永久性储存。最后一个模块(shelve)则两者兼有。db系列模块使用DBM格式写入数据。这些模块为用户的对象提供了一个命名空间,这些对象同时具备字典对象和文件对象的特点。不足之处在于只能储存字符串,不能对Python对象进行序列化。

9、相关模块

  • base64 提供二进制字符串和文本字符串间的编码/解码操作
  • binascii 提供二进制和ASCII编码的二进制字符串间的编码/解码操作
  • bz2 访问BZ2格式的压缩文件
  • csv 访问csv文件
  • filecmp 用于比较目录和文件
  • fileinput 提供多个文本文件的行迭代器
  • getopt/optparse 提供了命令行参数的解析/处理
  • glob/fnmatch 提供Unix样式的通配符匹配的功能
  • gzip/zlib 读写GNU zip(gzip)文件(压缩需要zlib模块)
  • shutil 提供高级文件访问功能
  • c/StringIO 对字符串对象提供类文件接口
  • tarfile 读写TAR归档文件,支持压缩文件
  • tempfile 创建一个临时文件(名)
  • uu uu格式的编码和解码
  • zipfile 用于读取ZIP归档文件的工具
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值