我有一个脚本,该脚本仅收集来自多个日志文件的重要文本行,并将其写入单独的文本文件。只要我提供一个搜索字符串片段,它就起作用。找到一旦找到,它将复制整个文本线,其中找到字符串片段。现在,我需要它根据已知的启动和结束文本摘要选择多条文本。我正在阅读的日志文件之间/包括启动和结束文本段之间的行总数各不相同。我已经搜索并尝试了很多东西,但是无法使其工作。我正在提供我到目前为止所拥有的。
我不是Python Newbie,但远非专家。任何/所有建议都非常感谢。
import os, time, datetime, fnmatch, re
from time import strftime, time
# Open log file to record actions
dirName = "D://GISlogs//" + strftime("%Y%m%d")
global pubfilePrefix
pubfilePrefix = datetime.datetime.now() + datetime.timedelta(minutes=1)
pubfileName = "D://GISlogs//" + strftime("%Y%m%d") + "//" + pubfilePrefix.strftime("%Y%m%d_%H%M%S") + "_SUMMARIZE_MorningActivities.txt"
if os.path.exists(pubfileName) and os.path.isfile(pubfileName) and os.access(pubfileName, os.W_OK):
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES1" + "rn" + "rn")
else:
try:
os.makedirs(dirName)
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES2" + "rn" + "rn")
except OSError:
if os.path.isdir(dirName):
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES3" + "rn" + "rn")
def Search_LogFile(searchPhrase, titleBlock):
if searchPhrase == "~-~-~":
with open(pubfileName, "a") as myFile:
myFile.write("rn" + titleBlock + "rn" + "---------------------------------------------------------------------------------------" + "rn")
with open("D://GISlogs//" + strftime("%Y%m%d") + "//" + searchFile, "r") as readFile:
for readLine in readFile:
if searchPhrase in readLine:
if re.compile("^[0-9]{4}-[0-9]{2}-[0-9]{2} ").match(readLine):
readLine = readLine[11:]
with open(pubfileName, "a") as myFile:
myFile.write(readLine)
for searchFile in os.listdir(dirName):
if fnmatch.fnmatch(searchFile, "*COPY_TaxRollData.txt"):
Search_LogFile("~-~-~", "Acquiring Updated Data from PVA")
Search_LogFile(" - DELETING PREVIOUSLY DOWNLOADED PVA DATA", "")
Search_LogFile(" - DOWNLOADING THE LATEST SNAPSHOT OF PUBLIC INQUIRY DATABASE", "")
Search_LogFile(" - ARCHIVING ALL DOWNLOADED FILES", "")
Search_LogFile(" - RECONCILING NEW DOWNLOAD WITH PRIOR DATA", "")
Search_LogFile(" - EXECUTING FME MODEL TO OVERWRITE PVA DATA IN SDE", "")
if fnmatch.fnmatch(searchFile, "*INTEGRATE_TaxRollData.txt"):
Search_LogFile("~-~-~", "Integrating Updated Data from PVA into the SDE Production EGDB")
Search_LogFile("|INFORM|Reading table/feature class '", "")
Search_LogFile("|INFORM|Opened Shape File '", "")
Search_LogFile("|INFORM|CSV reader: Opening dataset '", "")
Search_LogFile("|ERROR |", "")
Search_LogFile("|INFORM|Translation was SUCCESSFUL", "")
Search_LogFile("|INFORM|FME Session Duration:", "")
#THE NEXT 9 LINES IS MY LATEST ATTEMPT. IT WORKS OUTSIDE OF THIS BLOCK OF CODE, BUT NOT HERE
valid=False
for line in searchFile:
if re.compile(".*Features Written Summary.*").match(line):
valid=True
if re.compile(".*Total Features Written.*").match(line):
valid=False
if valid:
with open(pubfileName, "a") as myFile:
myFile.write(line)
#Search_LogFile("Features Written Summary", "")
Search_LogFile(" PVA TAX ROLL DATA HAS BEEN RE-INTEGRATED IN THE SDE PRODUCTION DATABASE", "")
print('rn' +'The Script Completed successfully')
进一步澄清 - 我希望以我的捕获开始的线条上的文本"特征书面摘要",而我希望以我的捕获结束的"写总功能"。两个片段都出现的整个线以及介于两者之间的所有线路)。启动和结尾片段都仅在日志文件中出现一次。
@madphysicist运行代码时,它会找到第一个日志文件并寻找特定的短语。当它找到它们时,它将写入整个文本行,其中将短语找到到另一个文本文件。然后,它寻找下一个特定的短语并做同样的事情。在该日志文件中查找所有特定短语后,它将找到下一个日志文件,并寻找特定于该特定日志文件的不同短语集。它效果很好。
但是我要添加的是有些不同的调整,我无法弄清楚。在第二个日志文件中,我想将其中的多个连续线复制到我的其他文本文件中。我可以使用上述方法复制起始行和终点线,但是皱纹是我还想在起始行和终点线之间复制所有文本行。开始线和终点之间的线数也可能会有所不同,因此不能硬编码。
所以我现在有一个工作解决方案,但是我不确定它是否是最有效的和/或可以更好地设计的。我将把它放置在适当的位置,但是如果有人能想到一种更好的方法来解决我想在这里做的事情,那么我全都是……
import os, time, datetime, fnmatch, re
from time import strftime, time
# Open log file to record actions
dirName = "D://GISlogs//" + strftime("%Y%m%d")
global pubfilePrefix
pubfilePrefix = datetime.datetime.now() + datetime.timedelta(minutes=1)
pubfileName = "D://GISlogs//" + strftime("%Y%m%d") + "//" +
pubfilePrefix.strftime("%Y%m%d_%H%M%S") + "_SUMMARIZE_MorningActivities.txt"
if os.path.exists(pubfileName) and os.path.isfile(pubfileName) and os.access(pubfileName, os.W_OK):
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES1" + "rn" + "rn")
else:
try:
os.makedirs(dirName)
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES2" + "rn" + "rn")
except OSError:
if os.path.isdir(dirName):
with open(pubfileName, "a") as myFile:
myFile.write(strftime("%Y-%m-%d %H:%M:%S") + " SUMMARIZING ALL GIS ACTIVITIES3" + "rn" + "rn")
def Search_LogFile(searchPhrase, titleBlock):
if searchPhrase == "~-~-~":
with open(pubfileName, "a") as myFile:
myFile.write("rn" + titleBlock + "rn" + "---------------------------------------------------------------------------------------" + "rn")
with open("D://GISlogs//" + strftime("%Y%m%d") + "//" + searchFile, "r") as readFile:
for readLine in readFile:
if searchPhrase in readLine:
if re.compile("^[0-9]{4}-[0-9]{2}-[0-9]{2} ").match(readLine):
readLine = readLine[11:]
with open(pubfileName, "a") as myFile:
myFile.write(readLine)
if searchPhrase in readLine and searchPhrase == "Features Written Summary":
valid=False
for line in readFile:
if re.compile(".*| Features Written Summary.*").match(line):
valid = True
if re.compile(".*END - ProcessID.*").match(line):
valid = False
if valid:
if re.compile("^[0-9]{4}-[0-9]{2}-[0-9]{2} ").match(line):
line = line[11:]
with open(pubfileName, "a") as myFile:
myFile.write(line)
for searchFile in os.listdir(dirName):
if fnmatch.fnmatch(searchFile, "*COPY_TaxRollData.txt"):
Search_LogFile("~-~-~", "Acquiring Updated Data from PVA")
Search_LogFile(" - DELETING PREVIOUSLY DOWNLOADED PVA DATA", "")
Search_LogFile(" - DOWNLOADING THE LATEST SNAPSHOT OF PUBLIC INQUIRY DATABASE", "")
Search_LogFile(" - ARCHIVING ALL DOWNLOADED FILES", "")
Search_LogFile(" - RECONCILING NEW DOWNLOAD WITH PRIOR DATA", "")
Search_LogFile(" - DISCONNECTING W: DRIVE", "")
Search_LogFile(" - EXECUTING FME MODEL TO OVERWRITE PVA DATA IN SDE", "")
if fnmatch.fnmatch(searchFile, "*INTEGRATE_TaxRollData.txt"):
Search_LogFile("~-~-~", "Integrating Updated Data from PVA into the SDE Production EGDB")
Search_LogFile("Reading table/feature class '", "")
Search_LogFile("Opened Shape File '", "")
Search_LogFile("CSV reader: Opening dataset '", "")
Search_LogFile("|ERROR |", "")
#Search_LogFile("|WARN |", "")
Search_LogFile("Features Written Summary", "")