回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在我第一次尝试python时,我编写了一些解析代码,可以按我的预期工作。在</p>
<p>我想把这段代码与其他一些外部人员共享(因为它所执行的功能可能对他们有用),并且说实话,我对我笨拙的和过分的代码感到羞愧。。。代码的实际工作部分很短,但我似乎已经花费了文件中70%的时间来声明和重新定义变量。。。。在</p>
<p>我很确定这不是正确的方法,我也不是要求某人逐行地挑选我的代码,但是一些关于清理混乱的基本建议会很棒。在</p>
<p>是的,在我把它推出之前,todo要对各个部分进行评论。。。。在</p>
<pre><code> import re, os
def setGlobals():
###################### match returns
global sigVersionMatch
global filepathMatch
global statusMatch
global puidMatch
global mimeMatch
global status2Match
global warningMatch
global filenameMatch
global fileExtensionMatch
###################### Flags and counters
global lineCounter
global headerFlag
global newLine
###################### header variables
global headerLineOne
global headerLineTwo
global sigVersion
###################### searches as a variable
global SearchForStatus
global SearchForFilename
global SearchForFilepath
global SearchForPuid
global SearchForMime
global SearchForStatus2
global SearchForWarning
global SearchForFileExtension
####################### searchstring variables
global filepath
global status
global puid
global mime
global status2
global warning
global filename
global sigVersion
global fileExtension
###################### file name lists
global newfile
####################### Flag and counters settings
headerFlag = 0
lineCounter = 0
newLine=""
###################### search strings headers
headerLineOne = re.compile(r'(DROID Version,)')
headerLineTwo = re.compile(r'(Status,File,Warning,)')
sigVersion = re.compile(r'(?<=SigFile Version,")[0-9]*')
###################### search strings body
filepath = re.compile(r'(?P<filepath>(F:\\ExLib.*\w))')
status = re.compile(r'(?P<status>(?<!,")(Positive|Not identified|Tentative))')
puid = re.compile(r'(?P<puid>(x-fmt/|fmt/)([0-9]{1,3}))')
mime = re.compile(r'(?P<mime>([a-zA-Z]*\/([a-zA-Z]|\-)*(?=",)))')
status2 = re.compile(r'(?P<status2>(Positive \(Specific Format\)|Positive \(Generic Format\)|(Tentative)(?=(",""))))')
warning = re.compile(r'(?P<warning>(Possible file extension mismatch))')
filename = re.compile(r'(?P<filenam>(V[0-9]\-.*\w))')
headerLineOne = re.compile(r'(DROID Version,)')
headerLineTwo = re.compile(r'(Status,File,Warning,)')
sigVersion = re.compile(r'(?<=SigFile Version,")[0-9]*')
fileExtension = re.compile(r'(?<=\.).*')
def doSearches(line):
global SearchForStatus
global SearchForFilename
global SearchForFilepath
global SearchForPuid
global SearchForMime
global SearchForStatus2
global SearchForWarning
global SearchForFileExtension
global status
global filename
global filepath
global puid
global mime
global status2
global warning
global fileExtension
global filepathMatch
global statusMatch
global puidMatch
global mimeMatch
global status2Match
global warningMatch
global filenameMatch
global fileExtensionMatch
####### do searches
SearchForStatus = status.search(line)
SearchForFilename = filename.search(line)
SearchForFilepath = filepath.search(line)
SearchForPuid = puid.search(line)
SearchForMime = mime.search(line)
SearchForStatus2 = status2.search(line)
SearchForWarning = warning.search(line)
###### convert search returns to strings
if SearchForStatus:
doInitialseVariables()
statusMatch = str(SearchForStatus.group())
if SearchForFilename:
filenameMatch = str(SearchForFilename.group())
SearchForFileExtension = fileExtension.search(filenameMatch)
if SearchForFileExtension:
fileExtensionMatch = str(SearchForFileExtension.group())
if SearchForFilepath:
filepathMatch = str(SearchForFilepath.group())
if SearchForPuid:
puidMatch = str(SearchForPuid.group())
if SearchForMime:
mimeMatch = str(SearchForMime.group())
if SearchForStatus2:
status2Match = str(SearchForStatus2.group())
if SearchForWarning:
warningMatch = str(SearchForWarning.group())
if statusMatch == str("Not identified"):
doBuildLine(line)
if SearchForPuid:
doBuildLine(line)
def doBuildLine(line):
global filepathMatch
global statusMatch
global puidMatch
global mimeMatch
global status2Match
global warningMatch
global filenameMatch
global fileExtensionMatch
global newLine
global lineCounter
global newfile
lineCounter = lineCounter + 1
print lineCounter
newLine = "3,"+ str(sigVersionMatch)+",slow," + str(lineCounter) + ",,," + str(filepathMatch) + "," + str(filenameMatch) + ",," + str(statusMatch) + ",,," + str(fileExtensionMatch) + ",," + str(warningMatch) + ",,," + str(puidMatch) + "," + str(mimeMatch) + ",,\n"
outfile = open(newfile,"a")
outfile.write(newLine)
outfile.close()
def doInitialseVariables():
global filepathMatch
global statusMatch
global puidMatch
global mimeMatch
global status2Match
global warningMatch
global filenamMatch
global lineOnceFlag
global fileExtensionMatch
global lineOneFlag
global lineTwoFlag
puidMatch = ""
mimeMatch= ""
status2Match = ""
warningMatch = ""
statusMatch = ""
filepathMatch = ""
filenameMatch = ""
fileExtensionMatch = ""
def doGetHeaderVariables(line):#matches header lines, strips sig version, saves as sigVersionMatch
global sigVersionMatch
M1 = headerLineOne.search(line)
M2 = headerLineTwo.search(line)
M3 = sigVersion.search(line)
if M3:
sigVersionMatch = str(M3.group())
def doStartProcessing(line):
global headerFlag
global lineCounter
if headerFlag == 0: #stops header match testing once successfully complete
doGetHeaderVariables(line)
headerFlag = 1
doSearches(line)
if __name__ == "__main__":
setGlobals()
global newfile
doInitialseVariables() #sets up the variable space to begin
directory = "C:\droid\logs\\"
extension = ".csv"
list_of_files = [file for file in os.listdir(directory) if file.lower().endswith(extension)]
for currentfile in list_of_files:
logpath = str(directory)+str(currentfile)
newfile = str(directory) + "cleaned\\" + str(currentfile)
for line in open(logpath,'r'):
doStartProcessing(line)
headerFlag = 0
lineCounter = 0
</code></pre>