Как открыть несколько файлов с помощью "with open" в Python?
Я хочу изменить несколько файлов одновременно, только если я могу записывать во все из них. Интересно, могу ли я как-то объединить несколько вызовов 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 ответ(ов)
Вам просто нужно заменить 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
.
Нестированные операторы 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:
Не понимаю причины для минус-голоса. Я протестировал свой код перед публикацией ответа, и он работает как задумано: записывает во все выходные файлы, как и спрашивалось в вопросе. Никаких дублирующих записей или ошибок при записи. Поэтому мне действительно любопытно, почему мой ответ считается неправильным, неэффективным или чем-то в этом роде.
В Python 2.6 не получится использовать конструкцию with
для открытия нескольких файлов одновременно. Вместо этого необходимо открывать файлы последовательно, как показано ниже:
with open('a', 'w') as a:
with open('b', 'w') as b:
Таким образом, вы можете гарантировать, что каждый файл будет правильно закрыт после использования.
Поздний ответ (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.
# Каждый параметр должен быть определён на отдельной строке и...
Если у вас есть дополнительные вопросы или вам нужна помощь с улучшением этой функции, не стесняйтесь спрашивать!
Если вы хотите сохранить оригинальные разрывы строк, даже если файл редактировался и сохранялся на разных операционных системах, имейте в виду, что в файле могут быть использованы различные символы для разрыва строк:
\n
(LF - Line Feed) используется в Linux.\r\n
(CR - Carriage Return, LF - Line Feed) используется в операционной системе Microsoft Windows.\r
используется в более старых версиях Mac и в некоторых Unix-операционных системах, таких как OpenBSD.
Чтобы сохранить оригинальные разрывы строк, выполните следующие шаги:
- Откройте файл в двоичном режиме:
with open('example.txt', 'rb') as f:
content = f.read()
- Раскодируйте байты в строку (предполагая кодировку UTF-8), сохраняя оригинальные разрывы строк:
content_str = content.decode('utf-8')
Теперь переменная content_str
будет содержать оригинальные разрывы строк, как они указаны в файле.
Для отображения разрывов строк в выводе используйте:
print(repr(content_str)) # Используйте repr для показа разрывов строк в выводе
Это позволит вам видеть, как именно сохранены разрывы строк в строковой переменной.
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Сохранение списка в файл с помощью Python с учетом переносов строк
Найти все файлы с расширением .txt в директории на Python
open() в Python не создает файл, если он не существует
Вывод строки в текстовый файл