本章将介绍python的文件处理和相关输入输出能力。
包括介绍文件对象(它的内建函数、内建方法和属性)、标准文件、同时讨论文件系统的访问方法、文件执行、最后简洁介绍持久存储和标准库中与文件有关的模块
内建函数open()和file() 提供了初始化输入/输出(I/O)操作的通用接口。
内建函数open()
基本语法:
file_object = open(file_name,access_mode='r',buffering=-1)
file_name是包含要打开的文件名字的字符串,它可以是相对路径或者绝对路径。可选变量access_mode也是一个字符串,代表打开文件的模式,默认是读取模式'r'
一些打开文件的例子:
fp = open('/etc/motd') #以读的方式打开
fp = open('test', 'w') #以写的方式打开
fp = open('data', 'r+') #以读写方式打开
fp = open(r'c: \io.sys', 'rb') #以二进制读模式打开
工厂函数file()
open()和file()函数具有相同的功能,可以任意替换。
文件的内建方法
In [1]: f = open('/tmp/test3','r+')
In [2]: f.
f.close f.fileno f.name f.readinto f.softspace f.writelines
f.closed f.flush f.newlines f.readline f.tell f.xreadlines
f.encoding f.isatty f.next f.readlines f.truncate
f.errors f.mode f.read f.seek f.write
#输入
#read()方法用来读取字节到字符串中,最多读取给定数目个字节。
#readline()方法读取打开文件的一行(读取下个行结束符之前的所有字节)。然后整行,包括行结束,作为字符串返回。
#readlines()会读取所有(剩余的)行然后把它们作为一个字符串列表返回。它的可选参数sizehit代表返回的最大字节大小
#xreadlines()不是一次性读取所有行,而是每次读取一块,所以用在for循环时可以减小对内存的占用,不过,随着Python中的迭代器和文件迭代的引入,没有必要再使用xreadlines(),因为与使用iter(file)和在for循环中文件迭代 for eachLine in file效果是一样的。
#输出
#write()方法把含有文本数据或者二进制数据块的字符串写入到文件中。
#writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将它们写入文件。行结束符并不会被自动加入,必须在调用writelines()前给每行结尾加入上行结束符。
#文件内移动
#seek()方法可以在文件中移动文件指针到不同的位置。offset字节代表相对于某个位置的偏移量。位置的默认值为0,代表从文件的开头算起(即绝对偏移量),1代表从当前位置算起,2代表从文件末尾算起。
#文件迭代
#一行一行的访问文件很简单:
for eachLine in f
...
#在这个循环里,eachLine代表文本文件中的一行(包括末尾的行结束符)。
#其他
#close() 通过关闭文件来结束对它的访问。Python垃圾收集机制也会在文件对象的引用计数降至零的时候关闭文件。如果你不显式地关闭文件,那么你可能丢失输出缓冲区的数据。
#fileno()方法返回打开文件的描述符。
#flush()方法会直接把内部缓冲区中的数据立即写入文件,而不是被动地等待输出缓冲区被写入。
#isatty()方法是一个布尔内建函数,当文件是一个类tty设备时返回True,否则返回False
#truncate()方法是将文件截取到当前文件指针位置或者到给定size,以字节为单位
- 有助于开平台开发的os模块属性
os 模块属性 | 描述 |
---|---|
linesep | 用于在文件中分隔行的字符串 |
sep | 用于分隔文件路径名的字符串 |
pathsep | 用于分隔文件路径名的字符串 |
curdir | 当前工作目录的字符串名称 |
pardir | (当前工作目录)父目录字符串名称 |
filename = raw_input('Enter file name: ')
fobj = open(filename,'w')
while True:
aLine = raw_input('Enter a line('.' to quit): ')
if aLine != '.':
fobj.write('%s%s' % (aLine,os.linesep))
else:
break
fobj.close()
标准文件
一般来说,只要你的程序一执行,你就可以访问3个标准文件。它们分别是标准输入(一般是键盘)、标准输出(到显示器的缓冲输出)和标准错误(到屏幕的非缓冲输出),命名分别是stdin
stdout
stderr
。
Python中可以通过sys模块来访问这些文件的句柄。导入sys模块之后,就可以使用sys.stdin
sys.stdout
sys.stderr
来访问。
print语句通常是输出到sys.stdout
而内建函数 raw_input()则通常从sys.stdin
接收输入
命令行参数
sys模块通过 sys.argv 属性提供了对命令行参数的访问。
argv
变量代表一个从命令行上输入的各个参数组成的字符串数组;
argc
变量代表输入的参数个数
在Python中,argc
就是sys.argv
列表的长度,即len(sys.argv)
,而该列表的第一项sys.argv[0]
永远是程序的名称
总结如下:
- **
sys.argv
是命令行参数的列表** - **
len(sys.argv)
是命令行参数的个数(也就是sys.argc
)
测试程序:
import sys
print 'you entered', len(sys.argv), 'arguments...'
pring 'they are: ',str(sys.argv)
$argv.py 76 tales 85 hawk
you entered 5 arguments...
they are: ['argv.py','76','tales','85','hawk']
os和os.path模块的例子(ospathex.py)
#!/usr/bin/env python
import os
for tmpdir in ('/tmp',r'c: \temp'):
if os.path.isdir(tmpdir):
break
else:
print 'no temp directory available'
tmpdir = ''
if tmpdir:
os.chdir(tmpdir)
cwd = os.getcwd()
print '*** current temporary directory'
print cwd
print '*** creating example directory...'
os.mkdir('example')
os.chdir('example')
cwd = os.getcwd()
print '*** new working directory...'
print cwd
print '*** original directory listing:'
print os.listdir(cwd)
print '*** creating test file ...'
fobj = open('test','w')
fobj.write('foo\n')
aline = 'bar'
fobj.write('%s%s' %(aline,os.linesep))
fobj.close()
print '*** updated directory listing:'
print os.listdir(cwd)
print "*** renaming 'test' to 'filetest.txt'"
os.rename('test','filetest.txt')
print '*** updated directory listing:'
print os.listdir(cwd)
path = os.path.join(cwd,os.listdir(cwd)[0])
print '*** full file pathname:'
print path
print '*** (pathname,basename) =='
print os.path.split(path)
print '*** (filename,extension) =='
print os.path.splittext(os.path.basename(path))
print '*** displaying file contents:'
fobj = open(path)
for eachLine in fobj:
print eachLine
fobj.close()
print '*** deleting test file'
os.remove(path)
print '*** updated directory listing:'
print os.listdir(cwd)
os.chdir(os.pardir)
print '*** deleting test directory'
os.rmdir('example')
print '*** Done'
文件执行
-
永久存储模块
pickle模块
marshal模块
文件相关模块
模块 | 内容 |
---|---|
base64 | 提供二进制字符串和文本字符串间的编码/解码操作 |
binascii | 提供二进制和ASCII编码的二进制字符串间的编码/解码操作 |
bz2 | 访问BZ2格式的压缩文件 |
csv | 访问csv文件(以逗号分隔文件) |
filecmp | 用于比较目录和文件 |
fileinput | 提供多个文本文件的行迭代器 |
getopt/optparse | 提供了命令行参数的解析/处理 |
gzip/zlib | 读写GNU zip(gzip)文件(压缩需要zlib 模块) |
shutil | 提供高级文件访问功能 |
c/StringIO | 对字符串对象提供类文件接口 |
tarfile | 读写TAR归档文件,支持压缩文件 |
tempfile | 创建临时文件(名) |
uu | uu 格式的编码/解码 |
zipfile | 用于读取ZIP归档文件的工具 |