Я работаю над симуляцией торгового автомата для школьной работы, и я хотел бы напечатать элементы в автомате с помощью цикла for из файла CSV. это работает, но если цикл for для печати списка акций повторяется, цикл не работает, так как атрибут line_num уже достиг конца файла CSV. Вот код:

    import csv
ITEM_COUNT = 0 #Counter for the FOR loop that prints the stocklist

OPEN_STOCK_READ = open("stock.csv", "r") #Sets up a variable for reading the stocklist
OPEN_STOCK_AMEND = open("stock.csv","a") #Sets up a variable for amending the stocklist
STOCK_READ = csv.reader(OPEN_STOCK_READ)
STOCK_AMEND = csv.reader(OPEN_STOCK_AMEND)

while True:
    ITEM_COUNT = 0
    for line in STOCK_READ:
        ITEM_COUNT = ITEM_COUNT + 1
        print("{0} - {1} - {2} in stock".format(ITEM_COUNT,line[0],line[1]))

Вот файл CSV, в котором я работаю:

Coca Cola,10
Monster,10
Monster Ultra,10
0
UnicornsOnLSD 13 Мар 2018 в 20:19

2 ответа

Лучший ответ

Используйте менеджер контекста для обработки чтения списка, и файл останется открытым только для той операции, которую он содержит.

import csv

def get_stock_count():
    ITEM_COUNT = 0
    with open('stock.csv', 'r') as STOCK_READ:
        reader = csv.reader(STOCK_READ)
        for line in reader:
            ITEM_COUNT = ITEM_COUNT + 1
            print("{0} - {1} - {2} in stock".format(ITEM_COUNT,line[0],line[1]))
    return ITEM_COUNT

Когда завершенный цикл for завершится, файл закроется. Каждый раз, когда вы хотите получить новый ITEM_COUNT, просто позвоните get_stock_count еще раз.

0
Eqomatic 13 Мар 2018 в 18:50

Проблема не в атрибуте line_num, а просто в том, что указатель файла находится в конце файла. Итак, у вас есть два варианта:

  • открывать файл на каждой итерации цикла while:

    while True:         // maybe a non ever lasting loop could be better...
        with open("stock.csv", "r+") as OPEN_STOCK_READ:
            STOCK_READ = csv.reader(OPEN_STOCK_READ)
            for row in STOCK_READ:
                # process row
    
  • перемотать файл в конце цикла:

    with open("stock.csv", "r+") as OPEN_STOCK_READ:
        while True:
            STOCK_READ = csv.reader(OPEN_STOCK_READ)
            for row in STOCK_READ:
                # process row
                ...
            OPEN_STOCK_READ.seek(0,0)   # rewind the file object
    

Также обратите внимание, что для обновления файла вы должны открыть его только один раз в режиме «r +».

0
Serge Ballesta 13 Мар 2018 в 17:57