Операция ввода-вывода при ошибке закрытого файла

#python #file-io #runtime-error

#python #file-io #время выполнения — ошибка

Вопрос:

Итак, я пишу эту программу, которая создает файлы чтения с помощью open() . Когда я пытаюсь запустить программу, она выдает мне ошибку: ValueError: операция ввода-вывода при закрытом файле (строка 18).

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

Я надеялся, что кто-нибудь сможет быстро просмотреть его и сообщить мне, если отступ неправильный, или иначе, если что-то еще может вызвать ошибку? Код (ошибка прокомментирована):

 sourceFile = 'test.html'
serviceTarget = "Plumbers amp; HVAC Experts"
cityTarget = "NJ"

services = {"Plumbers", "Air Conditioning Experts", "Drain Cleaning Experts"}
cities = {"Westfield", "Scotch Plains", "Clark"}

serviceNames = {"Plumbers":"plumbers", "Air Conditioning Experts":"ac", "Drain Cleaning Experts":"drain"}
totalPages = len(services)*len(cities)

for serviceRep in services:
    for cityRep in cities:
        outFileName = cityRep   " "   serviceNames[serviceRep]   ".html"
        outFileName = outFileName.replace(" ", "_");
        print("Writing "   outFileName   "...")
        infile = open(sourceFile)
        outfile = open(outFileName, 'w')
        for line in infile:   #This is the line giving me problems
            if serviceTarget in line:
                line = line.replace(serviceTarget,serviceRep)
            if cityTarget in line:
                line = line.replace(cityTarget,cityRep)
            outfile.write(line)
            infile.close()
            outfile.close()
        totalPages -= 1; 
        print("DONE -- "   str(totalPages)   " left to go")
  

Комментарии:

1. вы ссылаетесь на открытый файл, вы никогда не делали a .read() , чтобы получить содержимое, вы также пытаетесь закрыть файл несколько раз в цикле.

2. @MikeRixWolfe for line in infile уже читает файл.

Ответ №1:

Это похоже на проблему с отступом: вы действительно это имеете в виду infile.close() и outfile.close() принадлежите for line in infile: циклу?

Комментарии:

1. Вы правы! Я знал, что ответ был прямо перед моим лицом. Спасибо за вторую пару глаз 🙂

2. @user2779949 Я обычно добавляю пустую строку после блока, чтобы сделать ее более визуально с отступом, что помогло бы увидеть, что infile.close() находится не в том блоке.