Python编写更干净(更好)的代码常量,声明和重新声明变量

2024-06-16 14:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在我第一次尝试python时,我编写了一些解析代码,可以按我的预期工作。在

我想把这段代码与其他一些外部人员共享(因为它所执行的功能可能对他们有用),并且说实话,我对我笨拙的和过分的代码感到羞愧。。。代码的实际工作部分很短,但我似乎已经花费了文件中70%的时间来声明和重新定义变量。。。。在

我很确定这不是正确的方法,我也不是要求某人逐行地挑选我的代码,但是一些关于清理混乱的基本建议会很棒。在

是的,在我把它推出之前,todo要对各个部分进行评论。。。。在

    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

Tags: researchiflinegroupglobalcompilestr
3条回答

认真地建议Mark Katz's "Learning Python"获得关于全局和局部变量的使用、函数声明等非常好的部分

一点也不刻薄,因为我知道我很早就把这些东西拼凑在一起,但是把这些代码放在一个密码保护的文件里,读那本书,重写它,然后展示给公众。别让别人知道这个文件的密码,除了你自己。它的主要用途是提醒你在短时间内已经走了多远。在

也就是说,真的很好继续让这么多的正则表达式为你工作。在

  1. 如果您还没有读完教程:

  2. PEP-8

    • 这是python代码格式化的圣经。在
  1. 您只需要对要在函数中重新分配的名称使用global语句。您可以访问任何不需要它的名称,包括访问它来调用一个将修改对象的方法。

  2. 如果你使用一个类,你的代码将会大大简化。全局变量将成为对象的属性,而您的函数将成为方法。

  3. 不要使用制表符来缩进,使用空格(如果这样做,上面的代码是可读的)。

  4. 在使用正则表达式之前不需要编译它们。re模块会自动为您编译和缓存。

相关问题 更多 >