Python:在循环中关闭文件的问题

0 投票
2 回答
1595 浏览
提问于 2025-04-16 13:37

我在使用while循环的时候遇到了一个错误。我可以输入想要运行的数字,结果也能正确写入对应的.CSV文件。当这个数字的部分运行完后,它会问我是否想用一个新数字再试一次。新的数字代码会运行并创建新的.CSV文件,但文件大小却保持在0kb。我觉得这可能和完成后关闭文件有关,但我已经在代码里写了f#.close()。

举个例子:选择数字1,代码运行并正确保存了.CSV文件,然后选择“是”进行下一次运行,输入新数字(#2),代码#2运行了,但没有正确关闭,所以没有把任何信息保存到第二个CSV文件里。

无论我先选择哪个数字,这种情况都会发生。(例如:先选择3,3运行得很好并且保存得也很好。然后选择2,运行了但没有正确保存。)

这是我现在的代码:

f1 = file('1.csv', 'rb')
f2 = file('2.csv', 'rb')
f3 = file('3.csv', 'rb')

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.reader(f3)

number = raw_input("Enter number: ")

while True:
    if number == "1":
        f4 = file('No_1_Results.csv', 'wb')
        c4 = csv.writer(f4)
       <snip> #do stuff here
        print "Took ", time.time() - start, "seconds."
        f4.close()
        reset_answer = raw_input("Again? Type Y or N : ")
        if reset_answer == ("n" or "N"):
            print "Bye! from  #1"
            break
        if reset_answer == ("y" or "Y"):
            number = raw_input("Enter new number #: ")
            continue
        if reset_answer != ("n" or "N" or "y" or "Y"):
            print "Y or N only allowed. Try again."
            continue

    if number == "2":
        f5 = file('No_2_Results.csv', 'wb')
        c5 = csv.writer(f5)
        <snip> #do stuff here
         print "Took ", time.time() - start, "seconds."
        f5.close()
        reset_answer = raw_input("Again? Type Y or N : ")
        if reset_answer == ("n" or "N"):
            print "Bye! from  #2"
            break
        if reset_answer == ("y" or "Y"):
            number = raw_input("Enter new number #: ")
            continue
        if reset_answer != ("n" or "N" or "y" or "Y"):
            print "Y or N only allowed. Try again."
            continue

    if number =="3":
        f6 = file('No_3_Results.csv', 'wb')
        c6 = csv.writer(f6)
        <snip> #do stuff here
        print "Took ", time.time() - start, "seconds."
        f6.close()
        reset_answer = raw_input("Again? Type Y or N : ")
        if reset_answer == ("n" or "N"):
            print "Bye! from  #3"
            break
        if reset_answer == ("y" or "Y"):
            number = raw_input("Enter new number #: ")
            continue
        if reset_answer != ("n" or "N" or "y" or "Y"):
            print "Y or N only allowed. Try again."
            continue

    if number is not "1" or "2" or "3":
        print "Invalid number selected."
        number = raw_input("Please choose a number: ")
        continue

f1.close()
f2.close()
f3.close()

注意:我在Windows上使用Python 2.6 / 还在学习Python -

2 个回答

0
import csv

try:
    inp = raw_input    # Python 2.x
except NameError:
    inp = input        # Python 3.x

def processFile(infname, outfname, perRow):
    with open(infname,'rb') as inf, open(outfname,'w') as outf:
        incsv  = csv.reader(inf)
        outcsv = csv.writer(outf)
        outcsv.writerows(perRow(row) for row in incsv)
    print("{0} -> {1} successful".format(infname, outfname))

def doStuff(row):
    # do stuff here
    return row

def main():
    while True:
        name = inp('Enter next file name (or nothing to exit)')
        if name.strip():
            try:
                processFile(name+'.csv', name+'_result.csv', doStuff)
            except IOError, e:
                print(e)
        else:
            print("Goodbye.")
            break

if __name__=="__main__":
    main()

编辑:在查看了你提供的关于 Python:比较两个CSV文件并搜索相似项 的链接后,我会继续进行

def readMasterList():
    res = {}
    with open('masterlist.csv','rb') as inf:
        incsv = csv.reader(inf)
        head = incsv.next()  # skip header row
        for rownum,dat in enumerate(incsv):
            res[tuple(dat)] = rownum
    return res
masterList = readMasterList()

def doStuff(row, _ml=masterList):
    key = (row[1], row[3])
    try:
        rownum = _ml[key]
        row.append("FOUND in master list (row {0})".format(rownum))
    except KeyError:
        row.append("NOT FOUND in master list")
    return row
4

我想知道你在循环开始时打开的文件描述符(f1, f2, f3)到底在做什么。不过,我觉得你遇到的问题可能是因为你试图从其中一个文件描述符读取两次,但在读取时没有重置它的位置。看看下面的内容:

$ echo "Test reading from a file" >> test.out
$ python
>>> f1 = file('test.out')
>>> f1.readlines()
['Test reading from a file\n']
>>> f1.readlines()
[]

从文件中读取后,文件描述符会记住你上次读取的位置。要解决这个问题,你需要进行一次“寻址”,也就是把位置移动到文件的开头:

$ echo "Test reading from a file" >> test.out
$ python
>>> f1 = file('test.out')
>>> f1.readlines()
['Test reading from a file\n']
>>> f1.seek(0)
>>> f1.readlines()
['Test reading from a file\n']

我希望这就是你遇到的问题,否则你应该展示一下你在读取文件时的逻辑。

撰写回答