我有一个目录/backup/servers
,我的文件如下:
URF
VPF
XHF
我还有另一个文件/SUPPORT/data.txt
,其内容如下:
URF:Active:26-JAN-13
VPF:Active:26-JAN-13
XHF:Active:26-JAN-13
GSA:Active:26-JAN-13
HDKK:Active:26-JAN-13
我列出/backup/servers
目录并写入wmc.txt
文件,并希望将此文件的内容与/SUPPORT/data.txt
文件匹配,并打印/SUPPORT/data.txt
文件的匹配行。
为此,我已经编写了下面的脚本,但这并没有给我任何输出。能否帮助我完成这项任务。
#!/usr/local/bin/python2.7
import os
import re
DATA="/SUPPORT/data.txt"
path="/backup/servers"
fd = os.listdir(path)
p = r'wmc.txt'
p1 = r'wmc1.txt'
fh = open(p, 'w+')
for i in fd[-15:]:
if re.search("(.*)-MC(.*)",i):
rslt=i.replace("-MC","")
fh.write(rslt)
fh.write("\n")
fl=open(DATA,'r')
for line1 in fl:
for line2 in fh:
if re.match("(.*)line2(.*)",line1):
print line1
fh.close()
fl.close()
当前代码:
path="/backup/servers"
DATA="SUPPORT/data.txt"
fd=os.listdir(path)
for i in fd[-15:]:
if re.match("(.*)-MC(.*)",i):
rslt=i.replace("-MC","")
fh=open("wmc.txt",'w+')
fh.write(rslt)
fl=open(DATA,'r')
for line1 in fl:
fh.seek(0,0)
for line2 in fh:
if re.search(".*%s.*"%(line2),line1):
#if re.search(line2,line1):
print line1
break
答案 0 :(得分:0)
基本上,在编写时,文件指针会一直移动到写入的最后一个字符。
比方说,我有一个文件test.py
>>> f = open("test.py","w+") #this creates file
>>> f.write("hello") #write contents to file
>>> f.tell() #check for file pointer - since 5 character are written,
5
>>> [i for i in f] #on reading lines from file starts reading from where the file pointer is, therefore prints null.
[]
这是您面临的问题。由于您从同一个文件中编写并同时读取,因此您倾向于访问位于EOF的文件指针,因此最终会循环遍历空列表!
因此,使用f.seek应该将文件指针移动到所需的位置(reference)!
比如说,
>>> import os
>>> f.seek(0,os.SEEK_END)
>>> f.tell()
5
>>> [i for i in f]
[]
>>> f.seek(0,os.SEEK_SET)
>>> f.tell()
0
>>> [i for i in f]
['hello']
所以对于你的问题,
修改强> 它不仅与文件指针,而且,你的正则表达式。你目前正在检查line1中文本'line2'的正则表达式!因此他们不会有任何匹配!
您已将第2行与正则表达式中的(。*)连接起来。这就像".*"+line2+".*"
。或使用字符串格式为".*%s.*"%(line2)
import os
for i in fd[-15:]:
if re.search("(.*)-MC(.*)",i):
rslt=i.replace("-MC","")
fh.seek(0,os.SEEK_END) # append contents to file
fh.write(rslt)
fh.write("\n")
fl=open(DATA,'r')
for line1 in fl:
fh.seek(0,os.SEEK_SET) # move file pointer to beginning of file
for line2 in fh:
#if re.match("(.*)line2(.*)",line1): should be
if re.match(".*%s.*"%(line2),line1):
print line1
希望有所帮助!