本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数、内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块。

1 文件对象

  句柄、文件描述符,可以访问磁盘的普通文件,也可以访问设备文件等类文件。文件只是连续的字节序列,无论单字节还是大块数据,数据传输会用到字节流。

2 文件内建函数

  open()和file()功能一样,打开一个文件,返回一个文件对象,打开错误则引发错误。推荐:打开文件时用open,为了说明文件对象时用file,例如isinstance(fd, file)。

  语法:

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

  其中,参数访问模式包括:'r'读、'w'写、'a'追加(即使seek到其他地方,也是写入文件末尾)、'b'二进制(不能在前面出现)、'+'同时支持读写、'U'通用换行符。

  参数缓冲方式包括:0-不缓冲,1-只缓冲一行,>=2-给定值作为缓冲区大小,负数-系统默认缓冲机制(tty设备行缓冲,其他设备正常缓冲)。

2.1 通用换行符UNS

  不同OS的换行符不同,使用'U'标识打开文件时,通过Python的读方法返回的所有换行符都被替换为\n。

  文件对象的newlines属性记录原来的行结束符。它在没有碰到行结束符时为None,读到第一个行结束符时为第一个行结束符,读到其他行结束符时变成一个包含不同换行符的元组。

  UNS默认打开,不需要则在运行configure脚本时使用 --without-universal-newlines 开关关闭它。

3 内建函数

3.1 读文件

 read()      #读至文件结尾。如果给定参数size大小且为正,则最多读取size大小
readline() #读取下一行,包括行结束符,作为字符串返回。如果给定size,则最多读取size大小
readlines() #将各行组成一个列表返回,也有size参数,不常用

3.2 写入文件

 write()      #和read()功能相反
writelines() #接收一个字符串列表作为参数,行结束符需要自己添加

3.3 文件内移动

 seek(offset[, whence]) #将文件指针移动offset个字节,默认0从文件头开始,1从当前位置开始,2从文件尾开始
tell() #返回文件指针的位置,从头开始计算

3.4 文件迭代

 for eachline in fobj:      #直接迭代,eachline包括换行符
pass fobj.next() #返回下一行,包括换行符

3.5 其他

 close()    #关闭文件。如果不显式地关闭文件,可能丢失输出缓冲区的数据。
fileno() #返回打开文件的描述符。这是一个整数,可用在如os模块(os.read())的一些底层操作上。
flush() #直接把内部缓冲区中的数据立刻写入文件。
isatty() #当文件是一个类tty设备时返回True。
truncate() #将文件截取到当前文件指针位置或者到给定的size,以字节为单位。

3.6 示例

  由于操作系统的不同,换行符、路径分隔符都不同,因此os模块有助于跨平台开发,只要导入os模块就会设置为正确值:

 linesep  #行分隔符的字符串,linux中为'\n'
sep #路径名分隔符的字符串,linux中为'/'
pathsep #文件路径分隔符的字符串,linux中为':'
curdir #当前工作目录的字符串名称,linux中为'.'
pardir #(当前工作目录的)父目录字符串名称,linux中为'..'

  由于write()方法不会自己添加换行符,写入文件时要注意添加:

 fobj.write('hello world\n')
fobj.write('%s%s' % ('hello world', os.linesep))

  文件内移动文件指针:

>>> f=open('tmp', 'w+')       #打开文件,读写模式
>>> f.tell() #文件指针在0位置
0L
>>> f.write('test line 1\n') #写入一行
>>> f.tell() #文件指针后移12个字节
12L
>>> f.seek(-12,1) #在当前位置左移12个字节
>>> f.tell() #回到0位置
0L
>>> f.readline() #读取第一行
'test line 1\n'
>>> f.tell() #又向后移动12个字节
>>> f.close() #记得关闭文件

4 文件内建的数据属性

 file.closedTrue  #文件已关闭则为True
file.encoding #文件所使用的编码 - 当写入Unicode字符串时,它们将自动使用encoding转换为字节字符串;若encoding为None时使用系统默认编码
file.mode #文件打开时使用的访问模式
file.name #文件名
file.newlines #未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,有多种类型的行结束符时则为一个列表
file.softspace #为0表示在输出一数据后要加上一个空格符,1表示不加。一般程序员用不着,由程序内部使用。

5 标准文件

 sys.stdin   #标准输入
sys.stdout #标准输出
sys.stderr #标准错误

6 命令行参数

 sys.argv      #参数列表,类似于C语言的char ×argv[]
len(sys.argv) #参数歌手,Python没有argc

  还有两个模块用于辅助处理命令行参数:

 getopt   #简单,不很精细
optparse #复杂,面向对象

7 文件系统

  对文件系统的大部分访问通过os模块实现,它只是一个虚拟层,真正加载的模块与操作系统有关。

  os模块可以删除/重命名文件、遍历目录树、管理文件访问权限等,访问文件/目录的函数:

 **文件处理** 
1 mkfifo()/mknod() #创建命名管道/创建文件系统节点
remove()/unlink() #删除文件
rename()/renames() #重命名文件
stat/lstat() #返回文件信息
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设备号

  os.path完成管理和操作文件路径名中的各个部分、获取文件或子目录信息、文件路径查询等操作,路径名访问函数包括:

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

8 永久存储模块

  转换并储存Python对象,该过程将比基本类型复杂的对象转换为一个二进制数据集合。这个过程也被称为数据的扁平化、数据的序列化、数据的顺序化。

  marshal:只能处理简单Python对象。

  pickle:可以处理递归对象、被不同地方多次引用的对象、以及用户定义的类和实例。dump()和load()函数相互转换。

  DBM风格模块:数据库管理模块,anydbm可以自己选择最优模块。   

  shelve:使用anydbm模块寻找合适的DBM模块,然后使用cPickle来完成对储存转换过程。

9 相关的模块

 base64   #提供二进制字符串和文本字符串间的编码/解码操作
binascii #提供二进制和 ASCII 编码的二进制字符串间的编码/解码操作
bz2 #访问BZ2格式的压缩文件
csv #访问csv文件(逗号分隔文件)
filecmp #用于比较目录和文件
fileinput #提供多个文本文件的行迭代器
getopt/optparse #提供了命令行参数的解析/处理
glob/fnmatch #提供 Unix 样式的通配符匹配的功能
gzip/zlib #读写GNU zip(gzip)文件(压缩需要zlib模块)
shutil #提供高级文件访问功能,包括复制文件及其访问权限等
c/StringIO #对字符串对象提供类文件接口
tarfilea #读写TAR归档文件,支持压缩文件
tempfile #创建一个临时文件(名)
uu #格式的编码和解码
zipfile #用于读取 ZIP 归档文件的工具

  

Python核心编程--学习笔记--9--文件和输入输出的更多相关文章

  1. python核心编程学习记录之文件和输入输出

  2. Python核心编程--学习笔记--4--Python对象

    现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...

  3. Python核心编程--学习笔记--3--Python基础

    本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...

  4. Python核心编程--学习笔记--1--Python简介

    本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...

  5. Python核心编程--学习笔记--8--条件与循环

    本章讲述if.while.for以及与他们搭配的else.elif.break.continue.pass等语句. 1 if语句 语法:三部分——关键字if.条件表达式.代码块.(记住冒号) if c ...

  6. Python核心编程--学习笔记--7--字典和集合

    本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...

  7. Python核心编程--学习笔记--6--序列(下)列表、元组

    11 列表 类似于C语言的数组,但是列表可以包含不同类型的任意对象.列表是可变类型. 创建列表——手动赋值.工厂函数: >>> aList = [12, 'abc'] >> ...

  8. Python核心编程--学习笔记--6--序列(上)字符串

    本章研究Python中的序列:字符串.列表和元组.因为这些类型其实都是由一些成员共同组成的一个序列整体,所以我们把它们统称为序列.序列的存储结构可以表示为: 1 序列 序列类型有着相同的访问模式:按下 ...

  9. Python核心编程--学习笔记--2--Python起步(下)

    16 文件和内建函数open(),file() 打开文件: fobj = open(filename, 'r') for eachLine in fobj: print eachLine, #由于每行 ...

随机推荐

  1. MapReduce从输入文件到Mapper处理之间的过程

    1.MapReduce代码入口 FileInputFormat.setInputPaths(job, new Path(input)); //设置MapReduce输入格式 job.waitForCo ...

  2. Grunt 之 使用 JavaScript 语法检查工具 jshint

    前端开发环境准备好了,我们准备开始进行开发. 前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强 ...

  3. 关于ORA-04021解决办法(timeout occurred while waiting to lock object)

    某个应用正在锁定该表或者包 表为 select b.SID,b.SERIAL#,c.SQL_TEXT from v$locked_object a, v$session b, v$sqlarea c ...

  4. 学习资料 50个常用的sql语句

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  5. 洛谷P2320 鬼谷子的钱袋

    P2320 06湖南 鬼谷子的钱袋 171通过 480提交 题目提供者xmyzwls 标签各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 题目有误 数据需要特判 评测系统太神了 题目 ...

  6. webview渲染流程

    文档标记说明 ################# 消息边界 +++++++++++++++++ 区域分隔 $$$$$$$$$$$$$$$$$ 线程边界 ~~~~~~~~~~~~~~~~~ 进程边界 - ...

  7. com组件 Ieframe的主页锁定

    CLSID 里的ieframe的 shell OpenHomePage-> Command的默认项"C:\Program Files (x86)\Internet Explorer\i ...

  8. sphinx 超好资料

    http://www.ttlsa.com/?s=sphinx

  9. how to extract and decrypt WeChat EnMicromsg.db on Android phone

    One of my friend came to me with an Android phone. She saild somehting wrong with the hardware of he ...

  10. poj1006_Biorhythms

    英语真差劲啊,看题目没看明白,无奈重新开始手抄题目,突然发现一句话 “For each cycle,you will be given the number of days form the begi ...