1. 打开文件
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
fp = open(name, mode, buffering)
入口参数:
name:文件名
mode:选项、字符串
buffering:是否缓冲(0=不缓冲,1=缓冲,>1的int数=缓冲区大小)
返回值:文件对象
方法一:复杂写法
try:
f = open('xxx')
except:
print 'fail to open'
exit(-1)
try:
do something
except:
do something
finally:
f.close()
方法二:简单写法
with open('thefile.txt') as file_object:
all_the_text = file_object.read( )
这种方式,系统会自动帮你关闭文件
分析:
不安全写法:
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
注:这种方式可能会出错,当文件没有打开时,程序会出错
错误写法:
try:
file_object = open('thefile.txt')
all_the_text = file_object.read( )
except:
do something
finally:
file_object.close( )
注:这种方式看似正常,但是有很大隐患,因为把open语句放在try块里,当打开文件出现异常时,文件对象file_object无法执行close()方法。
2. 读文件
读文本文件
input = open('data', 'r') # 第二个参数默认为r, 可不传
input = open('data', 'rb') # 读二进制文件
读取所有内容
with open('thefile.txt') as file_object:
all_the_text = file_object.read( )
读固定字节
with open('abinfile', 'rb') as file_object:
try:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
except:
do ...
读每行
list_of_all_the_lines = file_object.readlines( )
如果文件是文本文件,还可以直接遍历文件对象获取每行:
for line in file_object:
process line
size为读取的长度,以byte为单位
F.read([size])
F.readline([size])
读一行,如果定义了size,有可能返回的只是一行的一部分
F.readlines([size])
把文件每一行作为一个list的一个成员,并返回这个list。
其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
3. 写文件
output = open('data', 'w') # 写文本文件
output = open('data', 'wb') # 写二进制文件
output = open('data', 'a') # 追加写文件
一次性写入数据
file_object.write(all_the_text)
写入多行
file_object.writelines(list_of_text_strings)
注意:调用writelines写入多行在性能上会比使用write一次性写入要高。
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
file = open('test.log', 'r')
sizehint = 209715200 # 200M
position = 0
lines = file.readlines(sizehint)
while not file.tell() - position < 0:
position = file.tell()
lines = file.readlines(sizehint)
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
4. 文件其他操作
函数 | 说明 |
---|---|
F.flush() | 把缓冲区的内容写入硬盘 |
F.fileno() | 返回一个长整型的”文件标签“ |
F.isatty() | 文件是否是一个终端设备文件(unix系统中的) |
F.tell() | 返回文件操作标记的当前位置,以文件的开头为原点 |
F.next() | 返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。 |
F.seek(offset[,whence]) | 将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。 |
F.truncate([size]) | 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。 |
5. 模式
模式 | 说明 |
---|---|
"r" | 以读方式打开,只能读文件 , 如果文件不存在,会发生异常 |
"r+" | 以可读写方式打开文件,该文件必须存在,否则会发生异常 |
"w" | # 以写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件 |
"w+" | 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
"a" | 以附加方式打开可写的文件,文件不存在会自动创建文件。 |
"a+" | 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) |
"rb" | 以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常 |
"wb" | 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件, 如果文件已存在,先清空,再打开文件 |
"rt" | 以文本读方式打开,只能读文件 , 如果文件不存在,会发生异常 |
"wt" | 以文本写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件 |
"rb+" | 以二进制读方式打开,可以读、写文件 , 如果文件不存在,会发生异常 |
"wb+" | 以二进制写方式打开,可以读、写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件 |