Python嵌套循环-继续迭代第一个循环
全新的编程,但非常愉快的挑战。 我怀疑这个问题可能是由于对python循环的误解造成的。 系统信息:在Win7 32位上使用notepad++和空闲python 3.4.3 我的解决方案是打开1个数据库,使用它从数据库2中查找正确的主条目,提取索引号(任务号),然后编写与第一个数据库相同的第三个文件,这次使用正确的索引号。 我的问题是,它正确地执行第一个和第二个循环,然后在循环1的第二次迭代中,尝试在循环2中执行块,同时迭代循环1的行,而不是循环2的任务行 脚注:这两个文件都相当大(几MB),所以我确信将它们存储在内存中是个好主意 这是一个我发现最接近这个问题的相关问题: 我从中得到的是,我尝试在第一个循环中移动打开的文件,但问题仍然存在。与我如何使用CSV阅读器有关 我还怀疑解决问题可能有根本原因,因此欢迎大家提出解决问题的其他方法的建议。 提前谢谢 要点:Python嵌套循环-继续迭代第一个循环,python,csv,python-3.x,nested-loops,Python,Csv,Python 3.x,Nested Loops,全新的编程,但非常愉快的挑战。 我怀疑这个问题可能是由于对python循环的误解造成的。 系统信息:在Win7 32位上使用notepad++和空闲python 3.4.3 我的解决方案是打开1个数据库,使用它从数据库2中查找正确的主条目,提取索引号(任务号),然后编写与第一个数据库相同的第三个文件,这次使用正确的索引号。 我的问题是,它正确地执行第一个和第二个循环,然后在循环1的第二次迭代中,尝试在循环2中执行块,同时迭代循环1的行,而不是循环2的任务行 脚注:这两个文件都相当大(几MB),所
for row in readerCurrentFile: #LOOP 1
# iterates through readerCurrentFile to define search variables
[...]
for task_row in readerTaskHeader: #LOOP 2
# searches each row iteratively through readerTaskHeader
# Match compid
#if no match, continue <<<- This is where it goes back to 1st loop
[...]
# Match task frequency
#if no match, continue
[...]
# once both of the above matches check out, will grab data (task_no from task_row[0]
task_no = ""
task_no = task_row[0]
if task_row:
break
[...]
# writes PM code
print("Successful write of PM schedule row")
print(compid + " " + dict_freq_names[str(pmfreqx) + str(pmfreq)] + ": " + pmid + " " + task_no)
import csv
import re
#Writes schedule
csvNewPMSchedule = open('new_pm_schedule.csv', 'a', newline='')
writerNewPMSchedule = csv.writer(csvNewPMSchedule)
# Dictionaries of PM Frequency
def re_compile_dict(d,f):
for k in d:
d[k] = re.compile(d[k], flags=f)
dict_month = {60:'Quin',36:'Trien',24:'Bi-An',12:'Annual(?<!Bi-)(?<!Semi-)',6:'Semi-An',3:'Quart',2:'Bi-Month',1:'Month(?<!Bi-)'}
dict_week = {2:'Bi-Week',1:'Week(?<!Bi-)'}
dict_freq_names = {'60Months':'Quintennial','36Months':'Triennial','24Months':'Bi-Annual','12Months':'Annual','6Months':'Semi-Annual','3Months':'Quarterly','2Months':'Bi-Monthly','1Months':'Monthly','2Weeks':'Bi-Weekly','1Weeks':'Weekly'}
re_compile_dict(dict_month,re.IGNORECASE)
re_compile_dict(dict_week, re.IGNORECASE)
# Unique Task Counter
task_num = 0
total_lines = 0
#Error catcher
error_in_row = []
#Blank out all rows
pmid = 0
compid = 0
comp_desc = 0
pmfreqx = 0
pmfreq = 0
pmfreqtype = 0
# PM Schedule Draft (as provided by eMaint)
currentFile = open('pm_schedule.csv', encoding='windows-1252')
readerCurrentFile = csv.reader(currentFile)
# Loop 1
for row in readerCurrentFile:
if row[0] == "pmid":
continue
#defines row items
pmid = row[0]
compid = row[1]
comp_desc = row[2]
#quantity of pm frequency
pmfreqx_temp = row[3]
#unit of pm frequency, choices are: Months, Weeks
pmfreq = row[4]
#pmfreqtype is currently only static not sure what other options we have
pmfreqtype = row[5]
#pmnextdate is the next scheduled due date from this one. we probably need logic later that closes out any past due date
pmnextdate = row[6]
# Task Number This is what we want to change
# pass
# We want to change this to task header's task_desc
sched_task_desc = row[8]
#last done date
last_pm_date = row[9]
#
#determines frequency search criteria
#
try:
pmfreqx = int(pmfreqx_temp)
except (TypeError, ValueError):
print("Invalid PM frequency data, Skipping row " + pmid)
error_in_row.append(pmid)
continue
#
#defines frequency search variable
#
freq_search_var = ""
if pmfreq == "Weeks":
freq_search_var = dict_week[pmfreqx]
elif pmfreq == "Months":
freq_search_var = dict_month[pmfreqx]
if not freq_search_var:
print("Error in assigning frequency" + compid + " " + str(pmfreqx) + " " + pmfreq)
error_in_row.append(pmid)
continue
#defines Equipment ID Search Variable
print(compid + " frequency found: " + str(pmfreqx) + " " + str(pmfreq))
compid_search_var = re.compile(compid,re.IGNORECASE)
#
# Matching function - search taskHeader for data
#
#PM Task Header Reference
taskHeader = open('taskheader.csv', encoding='windows-1252')
readerTaskHeader = csv.reader(taskHeader)
for task_row in readerTaskHeader:
# task_row[0]: taskHeader pm number
# task_row[1]: "taskHeader task_desc
# task_row[2]: taskHeader_task_notes
#
# search for compid
compid_match = ""
compid_match = compid_search_var.search(task_row[1])
if not compid_match:
print(task_row[1] + " does not match ID for " + compid + ", trying next row.") #debug 2
continue # <<< STOPS ITERATING RIGHT OVER HERE
print("Found compid " + task_row[1]) # debug line
#
freq_match = ""
freq_match = freq_search_var.search(task_row[1])
if not freq_match:
print(task_row[1] + " does not match freq for " + compid + " " + dict_freq_names[str(pmfreqx) + str(pmfreq)] + ", trying next row.") #debug line
continue
print("Frequency Match: " + compid + " " + dict_freq_names[str(pmfreqx) + str(pmfreq)]) # freq debug line
#
task_no = ""
print("Assigning Task Number to " + task_row[0])
task_no = task_row[0]
if task_row:
break
#
#error check
#
if not task_no:
print("ERROR IN SEARCH " + compid + " " + pmid)
error_in_row.append(pmid)
continue
#
# Writes Rows
#
writerNewPMSchedule.writerow([pmid,compid,comp_desc,pmfreqx,pmfreq,pmfreqtype,pmnextdate,task_no,sched_task_desc,last_pm_date])
print("Successful write of PM schedule row")
print(compid + " " + dict_freq_names[str(pmfreqx) + str(pmfreq)] + ": " + pmid + " " + task_no)
print("==============")
# Error reporting lined out for now
# for row in error_in_row:
# writerNewPMSchedule.writerow(["Error in row:",str(error_in_row[row])])
# print("Error in row: " + str(error_in_row[row]))
print("Finished")
读取器当前文件中的行:#循环1
#遍历readerCurrentFile以定义搜索变量
[...]
对于readerTaskHeader中的task_行:#循环2
#通过readerTaskHeader迭代搜索每一行
#匹配compid
#如果没有匹配,请继续查看我是否正确理解这一点。当您在内部/嵌套循环中找到包含
continue
语句的if语句时,它不会执行您希望它执行的操作吗?它所做的是继续内部/嵌套循环。不过,我不清楚你到底想要它做什么。你好,沙丘感谢你的回复。标记的continue将导致行迭代,而不是task_行。希望这能澄清问题。我认为内环中的最后一行是导致问题的原因。。。显然,task_no被设置为一个空字符串以外的值(这似乎是您所期望的),导致if语句(内部循环中的最后一个语句)执行并中断内部循环…好的。这与CSV模块无关,与break
和continue
的语义有关。这些语句只影响它们所在的最内部循环。如果您需要影响其他循环,那么这就是“代码气味”的标志——可以用更好的方式编写代码。我会尽我所能回答你的问题。科玛诺:这是一个可能捕捉到它的调试线路。然而,它从未达到这一点沙丘:标记的“继续”会影响外部循环,这是意外的。我试图让内部循环重复,直到找到一个同时满足if语句的循环,看看我是否理解正确。当您在内部/嵌套循环中找到包含continue
语句的if语句时,它不会执行您希望它执行的操作吗?它所做的是继续内部/嵌套循环。不过,我不清楚你到底想要它做什么。你好,沙丘感谢你的回复。标记的continue将导致行迭代,而不是task_行。希望这能澄清问题。我认为内环中的最后一行是导致问题的原因。。。显然,task_no被设置为一个空字符串以外的值(这似乎是您所期望的),导致if语句(内部循环中的最后一个语句)执行并中断内部循环…好的。这与CSV模块无关,与break
和continue
的语义有关。这些语句只影响它们所在的最内部循环。如果您需要影响其他循环,那么这就是“代码气味”的标志——可以用更好的方式编写代码。我会尽我所能回答你的问题。科玛诺:这是一个可能捕捉到它的调试线路。然而,它从未达到这一点沙丘:标记的“继续”会影响外部循环,这是意外的。我试图让内部循环重复,直到找到一个同时满足if语句的循环。