9

Как открыть несколько файлов с помощью "with open" в Python?

15

Я хочу изменить несколько файлов одновременно, только если я могу записывать во все из них. Интересно, могу ли я как-то объединить несколько вызовов open с помощью оператора with?

try:
    with open('a', 'w') as a and open('b', 'w') as b:
        do_something()
except IOError as e:
    print('Операция не удалась: %s' % e.strerror)

Если это невозможно, как будет выглядеть элегантное решение этой проблемы?

5 ответ(ов)

1

Вам просто нужно заменить and на ,, и всё готово. Вот исправленный код:

try:
    with open('a', 'w') as a, open('b', 'w') as b:
        do_something()
except IOError as e:
    print('Операция не удалась: %s' % e.strerror)

Обратите внимание, что в Python 3 требуется использовать скобки для функции print.

0

Нестированные операторы with выполняют ту же задачу, и, на мой взгляд, с ними проще работать.

Предположим, у вас есть файл inFile.txt, и вы хотите записать его содержимое одновременно в два файла outFile.

with open("inFile.txt", 'r') as fr:
    with open("outFile1.txt", 'w') as fw1:
        with open("outFile2.txt", 'w') as fw2:
            for line in fr.readlines():
                fw1.writelines(line)
                fw2.writelines(line)

EDIT:

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

0

В Python 2.6 не получится использовать конструкцию with для открытия нескольких файлов одновременно. Вместо этого необходимо открывать файлы последовательно, как показано ниже:

with open('a', 'w') as a:
    with open('b', 'w') as b:

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

0

Поздний ответ (8 лет), но для тех, кто хочет объединить несколько файлов в один, следующая функция может быть полезна:

def multi_open(_list):
    out=""
    for x in _list:
        try:
            with open(x) as f:
                out+=f.read()
        except:
            pass
            # print(f"Не удалось открыть файл {x}")
    return out

fl = ["C:/bdlog.txt", "C:/Jts/tws.vmoptions", "C:/not.exist"]
print(multi_open(fl))

2018-10-23 19:18:11.361 Профиль  [Стоп драйверы] [1мс]
2018-10-23 19:18:11.361 Профиль  [Детская инициализация] [0мс]
...
# Этот файл содержит параметры VM для Trader Workstation.
# Каждый параметр должен быть определён на отдельной строке и...

Если у вас есть дополнительные вопросы или вам нужна помощь с улучшением этой функции, не стесняйтесь спрашивать!

0

Если вы хотите сохранить оригинальные разрывы строк, даже если файл редактировался и сохранялся на разных операционных системах, имейте в виду, что в файле могут быть использованы различные символы для разрыва строк:

  • \n (LF - Line Feed) используется в Linux.
  • \r\n (CR - Carriage Return, LF - Line Feed) используется в операционной системе Microsoft Windows.
  • \r используется в более старых версиях Mac и в некоторых Unix-операционных системах, таких как OpenBSD.

Чтобы сохранить оригинальные разрывы строк, выполните следующие шаги:

  1. Откройте файл в двоичном режиме:
with open('example.txt', 'rb') as f:  
    content = f.read()
  1. Раскодируйте байты в строку (предполагая кодировку UTF-8), сохраняя оригинальные разрывы строк:
content_str = content.decode('utf-8')  

Теперь переменная content_str будет содержать оригинальные разрывы строк, как они указаны в файле.

Для отображения разрывов строк в выводе используйте:

print(repr(content_str))  # Используйте repr для показа разрывов строк в выводе

Это позволит вам видеть, как именно сохранены разрывы строк в строковой переменной.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь