python: получение ValueError: операция ввода-вывода для закрытого файла - PullRequest
0 голосов
/ 08 ноября 2019

У меня проблема с моим кодом. Я пытаюсь заменить шаблон и файл. Сначала у меня произошла ошибка с количеством открываемых файлов, потому что я забыл закрыть свой файл. Но теперь у меня есть f.close () в моем коде, и у меня есть следующая ошибка:

ValueError: I/O operation on closed file.

Здесь вы можете найти часть моего кода. У кого-то есть представление о том, что не так?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import shutil
from tempfile import mkstemp

infile = 'test_file.txt'
year  = int('2009')
month = int('1')
day   = int('10')

#################################################################################
def sed(pattern, replace, source):
    """
    Reads a source file and writes the destination file.
    In each line, replaces pattern with replace.
    Args:
        pattern (str): pattern to match (can be re.pattern)
        replace (str): replacement str
        source  (str): input filename
    """
    fin = open(source, 'r')
    fd, name = mkstemp()
    fout = open(name, 'w')
    for line in fin:
        out = re.sub(pattern, replace, line)
        fout.write(out)
    fin.close()
    fout.close()
    shutil.move(name, source) 

#################################################################################
def main():
    """
    Replace all year-month-days which have a possible wrong pattern
    """
    for i in range (6):
        for j in range (12):
            for k in range (22):
                Year = year + i; Month = month + j; Day = day + k
                pattern = '%s %s%s' %(Year, Month, Day)
                replace = '%s %s %s' %(Year, Month, Day)
                sed(pattern, replace, infile)

#################################################################################
if __name__ == "__main__":
    main()

###### END 

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Я публикую это как другой ответ, потому что, ну, он явно другой.

Поскольку у вас есть проблема с вашей функцией sed, открывающей слишком много файлов, я попытался написать что-то, что открывает файлы как можно меньшераз, как это возможно. Более того, вы сказали, что файл, который вы хотите редактировать, довольно большой, поэтому я старался не читать его прямо в память.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

input_file = 'test_file.txt'
output_file = 'result_file.txt'

def main():
  pattern = r"(\d{4}) (\d{1,2})(\d{2})"
  replace = r"\1 \2 \3"
  with open(input_file, "r") as inp:
    with open(output_file, "w") as oup:
        for line in inp:
          sub = re.sub(pattern, replace, line)
          oup.write(sub)

if __name__ == "__main__":
    main()
0 голосов
/ 08 ноября 2019

Я думаю, проблема в том, что вы неправильно используете свою функцию sed. Вы открываете файл, который хотите редактировать, внутри своей функции main, а затем снова открываете (и затем закрываете) внутри функции sed.

Похоже, ваша функция sed должнаиспользоваться для всего файла, а не только для строки.

Если вы измените свою функцию main на что-то подобное, она должна работать (если нет, прокомментируйте, что не так):

def main():
    """
    Replace all year-month-days which have a possible wrong pattern
    """
    occurrences = 999 # arbitray number. If you know the exact number, you may want to edit this.
    for i in range (6):
        for j in range (12):
            for k in range (22):
                Year = year + i; Month = month + j; Day = day + k
                pattern = '%s %s%s' %(Year, Month, Day)
                replace = '%s %s %s' %(Year, Month, Day)
                sed(pattern, replace, infile, count=occurrences)
...