我是Python的新手(刚刚在5小时前开始),但我有大约一年的Java经验。无论如何,我想制作的第一个程序会创建一种名称/生日的“日志”。它会提示用户输入的条目数,然后是姓名和生日。这很简单,工作正常。每次运行程序时,它都会将新的名称/出生日期附加到文本文件中,以便之前的名称/出生日期保持不变,新的名称出生在最后。但是我希望能够按姓氏对这些条目进行排序。我成功地创建了一种按姓氏对它们进行排序的方法(同样不是复杂的)但是只有它是自己独立的程序才有效。如果我将代码放在原始程序的末尾,它将按预期排序,但它不会对程序中的任何新条目进行排序,只会对上次运行程序时的条目进行排序。我确实关闭了文件并在输入后在代码中重新打开它,但它仍然无法识别所做的更改。因为这两个程序都可以自行运行,所以我需要做什么才能在同一个程序中实现这两个代码?或者,是否有办法从第一个程序运行第二个程序?
这是我的程序代码(BirthDates.txt是存储条目的文本文件):
#IDLE 1.2.4
#Begin Entries
fileobja=open("BirthDates.txt","a")
dates=int(raw_input("Number of entries to add:"))
count=0
while count<dates:
fileobja.write("*NEW ENTRY*")
firstName=raw_input("Enter user's first name:")
lastName=raw_input("Enter user's last name:")
DOB=raw_input("Enter user's date of birth (MM/DD/YYYY):")
print lastName+","+firstName+"\n"+DOB
fileobja.write("\n")
fileobja.write(lastName+", "+firstName+"\n")
fileobja.write("("+DOB+")"+"\n"+"__________\n")
#print "dates=",dates
#print "count=",count
count=count+1
#print "count=",count
fileobja.close
#End Entries
这是第二个程序:
#Begin Sorter
fileobjr=open("Birthdates.txt","r")
fileList=[]
tempString=""
tempStringCount=0
for line in fileobjr:
tempString="".join(line[0:])
#print "tempString="+tempString
fileList.append(tempString)
tempStringCount=tempStringCount+1
fileobjr.close
fileListLength=len(fileList)
#print fileListLength
chunks=(fileListLength)/4
sortCount=1
tempList=[]
while sortCount<fileListLength:
templine=fileList[sortCount]+fileList[sortCount+1]
tempList.append(templine)
sortCount=sortCount+4
writeCount=0
tempList.sort()
fileobjw=open("BirthDates.txt","w")
while writeCount<chunks:
#print tempList[writeCount]
fileobjw.write("*NEW ENTRY*\n")
fileobjw.write(tempList[writeCount])
fileobjw.write("__________")
fileobjw.write("\n")
writeCount=writeCount+1
fileobjw.close
#End Sorter
答案 0 :(得分:4)
问题在于:
fileobja.close
......还有一些相似的内容。
您不是调用 close
方法,您只是将其作为值引用。因此,该文件不会被关闭,这意味着它不会被刷新,这意味着您写入它的任何内容可能都无法读取。
要修复它,只需调用方法:
fileobja.close()
作为旁注,通常更容易使用with
语句,该语句在您退出其中的块时负责关闭文件。 (这就像是一次神奇的尝试/终于。)而不是:
f = open('foo', 'a')
do_stuff(f)
do_more_stuff(f)
# ...
f.close()
这样做:
with open('foo', 'a') as f:
do_stuff(f)
do_more_stuff(f)
# ...