本章将深入介绍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. html——SVG

    SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形 ...

  2. 题目1005:Graduate Admission

    题目1005:Graduate Admission 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: It is said that in 2011, there are about 1 ...

  3. 文件的输出与载入之java操作

    一.前言 学习java没多久,关键是没怎么系统学过.都是看别人的代码来学习的.今天就把一直以来让我头痛的java  IO 的一些基本操作来记录下来,加深记忆. 二.java导入文件到内存中 首先放一个 ...

  4. Xml语言

    一.XML是什么?作用是什么? l  XML ( eXtensible Markup Language )语言是一种可扩展的标记语言.其中的可扩展是相对HTML来说的.因为XML标签没有被预定义,需要 ...

  5. GitHub指南

    1.创建新仓库 #创建新文件夹,打开,然后执行 git init #以创建新的 git 仓库. 2.检出仓库 #执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/rep ...

  6. yii中的若干问题

    一直觉得”程序猿“是个很细致的工作,就像绣花一样,一不小心缝错一针,就可能是个很大的bug,但是为什么平时看起来大而化之的男同胞们确能在这方面如此care呢?? 以下进入正文,省去华丽丽的词语,这里仅 ...

  7. LARGE_INTEGER

    #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR ipCm ...

  8. javascript设计模式-享元模式

    享元模式采用一个共享来有效的支持大量细小粒度的对象,避免大量有相同内容的类的开销(如内存耗费),共享一个元类. 应用场景:页面存在大量的资源密集型对象:他们具备一些共性,可以分离出公共操作的数据. 一 ...

  9. spring+hibernate--直接修改数据库,再通过hibernate查询数据不变

    这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响. 刚好今天没事,想好好解决一下这个问题. hibernate主要配置如下: <property name="h ...

  10. Ubuntu工具:vi编辑器

    Vi简介 Vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样.它可以执行输出.删除.查找.替换.块操作等众多文本操作,而且用户可以根据自己的需要对 ...