Python: проблема с закрытием файлов во время цикла - PullRequest
0 голосов
/ 13 марта 2011

Я столкнулся с ошибкой при работе с циклом while. Я могу ввести число, которое хочу запустить, и результаты правильно записаны в соответствующий файл .CSV. Как только секция для этого номера будет запущена, она спросит, хочу ли я попробовать еще раз с новым номером. Он запускает новый числовой код и создает новый .CSV, но размер файла остается равным 0 КБ. Я думал, что это связано с закрытием файла после завершения, но я написал там f # .close ().

Пример: выберите номер 1, код для # 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()

Примечание : Использование Python 2.6 в Windows / все еще изучаем Python -

Ответы [ 2 ]

4 голосов
/ 13 марта 2011

Было бы неплохо узнать, что именно вы делаете с дескриптором файла, который вы открыли в начале цикла (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']

Я надеюсь, что это ваша проблема, в противном случае вы должны показать логику, которую вы имеете при чтении файла.

0 голосов
/ 13 марта 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...