异想天开

What's the true meaning of light, Could you tell me why

python操作文件

日期:2014-12-22 17:32:44
  
最后更新日期:2015-06-15 14:44:45
【技术水文】
1.python打开一个记录文件,该文件需要不停添加,同时若不存在该文件,需要创建它,同时还需要读该文件。创建方式为是"rw",还是"rw+"?"rw+"打开若文件存在,会截断文件。要用"a+"方式
[code lang="cpp"]
fp = open(log_file,"a+")
if not fp:
print "log_file could not open,please check\n"
exit(0)
[/code]
open打开的文件是一个对象,如果需要获得 File descriptors,需要调用fp.fileno()。

2.移动文件指针
在操作过程中,文件指针会移动,有时需要移动文件指针
[code lang="cpp"]
fp.seek(0, 0) #移动到文件开头 SEEK_SET
fp.seek(1,0) #当前位置 SEEK_CUR
fp.seek(2,0) #文件结尾 SEEK_END
[/code]
3.文件截断
有时需要程序来根据条件截断文件,不然文件一直不停添加,也挺恐怖的
[code lang="cpp"]
#移动到文件开头然后截断
fp.seek(0, 0)
fp.truncate()
[/code]

4.日志型的文本文件读取需要去掉回车
[code lang="cpp"]
log_file_pointer.seek(0, 0)
current_time=int(time.time())
for line in log_file_pointer.readlines():
line="".join(line.split())
_now,status = line.split('->')

try:
for line in file_object:
do_something_with(line)
finally:
file_object.close( )
[/code]
这里用到了,split和join方法,该方法调用有两种形式,一种如上例,若分割符号为空或None,那么返回的字符串头和尾都不能含有空格。这里回车这类也认为是空格:
[code lang="cpp"]
import string
print string.join(string.split("abcd\n\n",None))
print string.join(string.split("abcd\n\n"))
[/code]
结果都为:['abcd']

5.文件fcntl
[code lang="cpp"]
flag= fcntl.fcntl(fp.fileno(),fcntl.F_GETFD )
fcntl.fcntl(fp.fileno(),fcntl.F_SETFD,flag|fcntl.FD_CLOEXEC)
[/code]

6.文件打开的方式
文件系统的文件,若写方式打开文件,然后移动写指针,写时的操作是覆盖而不是追加操作。