python学习[第十四篇] 文件的输入与输出
标准文件类型
一般来说只要程序一执行,就会访问3个文件:
标准输入(键盘) stdin
标准输出(显示器缓冲区) stdout 默认输出到屏幕
标准错误(到屏幕的非缓冲输出) stderr 默认输出到屏幕
可以通过sys模块来访问这些文件的句柄,sys.stdin,sys.stdout,sys.stderr 可以通过print >>重定向到标准输出文件中
>>> import sys
>>> print >> sys.stderr, 'jhh'
jhh
>>> print >> sys.stdout, 'jhh'
jhh
文件对象
文件对象不仅可以用来访问普通的磁盘文件,也可以访问如上的抽象层面的文件。
可以通过内建函数file() 和open()作为钩子来操作文件。file()和open()具有相同功能,一般open作为读文件用,file文件用来写和其他操作。
文件对象的访问模式:
r | 以读方式打开 |
rU | 以读方式打开,同时支持通用换行符 |
r+ | 以读写模式打开 |
rb | 以二进制读模式打开 |
rb+ | 以二进制读写模式打开 |
w | 以写模式打开 |
w+ | 以读写模式开店 |
wb | 以二进制写模式打开 |
wb+ | 以二进制读写模式打开 |
a | 以追加方式打开 |
a+ | 以读写模式打开 |
ab | 以二进制追加模式打开 |
ab+ | 以二进制读写模式打开 |
文件内建方法
文件方法可以分为四类 ,输入,输出,文件内移动和杂项
输入
read(size=-1)直接读取字节到字符串中,最多读取给定字节数,如果size没有指定,则size默认值为-1直接读取到文件末尾。
readline(size=-1) 读取文件的一行,然后整行包括换行符作为字符串返回。如果指定size且读取size个字节后没有达到末尾,那么就返回size个字节到字符串
realines(sizhint) 会读取剩余的行数,然后以字符串列表的形式返回。如果sizhint大于0 ,那么会返回大约sizehint个字符串,因为有字符串缓冲区的关系。
xreadlines() 会返回一个迭代类型。
>>> f=file('d:/test.txt','r')
>>> f.read(3)
'thi'
>>> f.readline(3)
's i'
>>> f.readline()
's a test12345\n'
>>> f.readlines()
['67890\n']
>>> f.tell()
28L>>> f.seek(0)
>>> for x in f.xreadlines():
... print x,
...
this is a test12345
输出
write()把文本数据或二进制数据写到文件中。
writelines() 接收一个列表作为参数,换行符不会被自动加入,如果需要加入换行符的话需要手动加入。
>>> f=file('d:/test.txt','w')
>>> ttt='this is a test'
>>> f.write(ttt)
>>> f.tell()
14L
>>> flines=['12345\n','67890\n']
>>> f.writelines(flines)
>>> f.close()
文件内移动
seek(offset)方法 可以在文件中移动指针到不同的位置。offsite字节代表相对于某个位置的偏移量。offset默认为0
tell() 是seek的补充,告诉当前文件指针在文件的位置。
文件迭代
文件迭代方法比旧方法(逐一行读取),更为高效,而且写法简洁。
for eachline in f:
suite_to_repeat
旧方法 逐一行读取
for eachline in f.readline():
suite_to_repeat
#文件迭代
>>> f.seek(0)
>>> for x in f:
... print x,
...
this is a test12345
67890
#旧方法,一次读入文件,然后遍历文件每一行
>>> f.seek(0)
>>> for x in f.readlines():
... print x,
...
this is a test12345
67890
#旧方法,每次都一行文件直到文件末尾
>>> while True:
... x = f.readline()
... if x:
... print x,
... else:
... break
...
this is a test12345
67890
其他方法
close() 是file和open之后 用来关闭句柄的方法。要养成良好的编程习惯,打开文件句柄后,一定要记得关闭句柄
fileno()返回打开文件的描述符,是一个整型
flush()会将缓冲区数据立刻写入磁盘。
truncate(size) 如果给定size那么文件将被截取到size字节处。,如果没有给定size,那么将截取到当前位置,如果为0
文件对象内建属性
file.closed() 文件是否被关闭,未关闭则为false
file.encoding 文件使用的编码。 encoding为non 则使用系统默认编码
file.mode 文件的打开模式
file.name文件名
file.newlines 未读取到行分割符时为None,只有一种分隔符时为一个字符串,如果有多种分隔符时,则包含当前所遇到的所有分隔符的列表
file.softspace 为0表示在输出一个数据后加上空格符,为1表示不加
>>> print f.name
d:/test.txt
>>> print f.fileno
<built-in method fileno of file object at 0x01F6D1D8>
>>> print f.closed
False
>>> print f.encoding
None
>>> print f.mode
r
>>> print f.newlines
None
>>> print f.softspace
0
命令行参数
sys模块通过调用sys.argv属性提供了对命令行参数的访问。
sys.argv是命令行参数的列表 len(sys.arge)是命令行参数的个数,即c语言中的argc.
sys.argv[0]永远是程序的名称。
获取命令行参数在编写脚本时非常有用。例如
copy_file_to_each_server.py serverlist
此时sys.argv[0]即为文件名: copy_file_to_each_server.py ,而sys.argv[1]即为我们需要的参数 server列表我们通过遍历server列表将文件copy到每个server上。
命令行参数 :其他有用模块 getopt,getparse.
### cmdargs.py
import sys
allargs=sys.argv
print 'program name is : ',sys.argv[0]
print 'parameters are :' ,sys.argv[1:]
# results is
C:\Users\Ryan\Desktop>python cmdargs.py 1 2 3 4
program name is : cmdargs.py
parameters are : ['1', '2', '3', '4']