Перейти к содержимому

Как открыть несколько файлов в python

  • автор:

Одновременное чтение из одного и запись в другой файл в Python

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

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

>>> text = 'Строка №1\nСтрока №2\nСтрока №3\n\ . Строка №4\nСтрока №5\nСтрока №6\nСтрока №7\n\ . Строка №8\nСтрока №9\nСтрока №10' >>> with open('foo.txt', 'w') as fp: . fp.write(text) 

Теперь будем читать построчно, менять слово «Строка» на слово «Линия -» и сразу же записывать изменения в файл new_foo.txt . Файл new_foo.txt нам создаст функции open() с символом ‘w’ для аргумента mode .

>>> read_file = 'foo.txt' >>> write_file = 'new_foo.txt' >>> with open(read_file, 'r') as fr, open(write_file, 'w') as fw: . for line in fr: . line = line.replace('Строка', 'Линия -') . fw.write(line) 

Прочитаем созданный файл new_foo.txt :

>>> read_file = 'new_foo.txt' >>> with open(read_file, 'r') as fr: . for line in fr: . print(line, end='') . # Линия - №1 # Линия - №2 # Линия - №3 # Линия - №4 # Линия - №5 # Линия - №6 # Линия - №7 # Линия - №8 # Линия - №9 # Линия - №10 

Для обработки файлов в несколько потоков смотрите модуль threading .

Объединение нескольких фалов в один.

Для решения данной задачи используем модуль стандартной библиотеки fileinput .

Для избежания рекурсивного чтения-записи, при отборе файлов из исходного каталога по маске ‘.txt’ , создаваемому общему файлу дано расширение .all, а не .txt.

import fileinput, pathlib # каталог текстовых файлов # измените на свой pth = '/path/to/txt/files' # маска поиска файлов по расширению pattern = '*.txt' files_path = pathlib.Path(pth) list_files = files_path.glob(pattern) # общий файл, создадим в текущем каталоге new_file = 'new_file.all' if list_files: with fileinput.FileInput(files=list_files) as fr, open(new_file, 'w') as fw: for line in fr: # определяем первую строку # читаемого файла из каталога if fr.isfirstline(): # название читаемого файла file_name = fr.filename() # дописываем строку с названием файла fw.write(f'\n\n------------ file_name>\n\n') # пишем данные fw.write(line) 

Конечно, можно решить эту задачу без использования модуля fileinput , но на обработку файлов будет затрачено больше времени.

  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Составление пути к файлу в Unix и Windows
  • Открытие/закрытие файла для чтения/записи
  • Типы обрабатываемых данных и файлов
  • Способы чтения открытого файла
  • Способы записи в открытый файл
  • Одновременное чтение из одного и запись в другой файл
  • Добавление данных в открытый файл
  • Управление указателем чтения/записи в файле
  • Создание менеджера для обработки файла
  • Сохранение словарей в формат JSON
  • Встроенные модули для работы с разными форматами

Как последовательно открыть несколько файлов txt и проверить значения в них?

У меня есть программа способная расшифровывать зашифрованные файлы. В начале после запуска необходимо загрузить ранее созданный ключ с ответами, нажав на кнопку «Загрузить ключи с ответами» после чего выбрать нужный ключ, данные из ключа автоматически загрузятся в lineEdit . После чего, по моей задумке, пользователь вводит директорию в которой находятся файлы для проверки (их может быть огромное множество, а может быть и один), после чего нажимает на кнопку «Начать проверку работ», после чего программа должна сама по очереди открыть все файлы в этой директории с расширением .txt , и проверить полученные данные из ранее загруженного ключа и данных располагающихся в файле (файлы тоже зашифрованы и расшифровываются точно также как и ранее загруженный ключ), программа проверяет каждую строку, по итогу программа выводит в другой файл .txt (находящийся в другой директории) все данные из файла (в расшифрованном виде) и баллы. Пример вывода №1: 1, №2: 0 (и так 12 раз). Текста много, но только так можно объяснить, что я пытаюсь сделать, но как то даже не приходит в голову идей как это реализовать. main.py:

# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets from crypto import Ui_MainWindow from PyQt5.Qt import * import rsa import base64 import os class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.answers = [] self.setWindowTitle("Automatic OGE verification system ver.00.09.56") self.btn_generate_keys.clicked.connect(self.func_generate_keys) (self.key_pub, self.key_priv) = rsa.newkeys(512) self.pushButton_2.clicked.connect(self.information) self.pushButton_3.clicked.connect(self.app_key_task) def verification(self): pass def information(self): if not os.path.exists('key_pub.pem'): msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText("Ошибка") msg.setInformativeText('ВНИМАНИЕ! Публичный ключ не найден' 'Попробуйте сгенерировать новый ключ.') msg.setWindowTitle("Ошибка") msg.exec_() return with open('key_pub.pem', "rb") as f: _key_pub = f.read() key_pub = self.key_pub.load_pkcs1(_key_pub) self.bit_key = self.lineEdit_13.text() self.directory_key_check = self.lineEdit_14.text() self.directory_file_check = self.lineEdit_15.text() self.name_file_key = self.lineEdit_16.text() self.directory_check_file = self.lineEdit_17 self.key_task(key_pub) def key_task(self, key_pub): self.number_1 = self.lineEdit.text() self.number_2 = self.lineEdit_2.text() self.number_3 = self.lineEdit_3.text() self.number_4 = self.lineEdit_4.text() self.number_5 = self.lineEdit_5.text() self.number_6 = self.lineEdit_6.text() self.number_7 = self.lineEdit_7.text() self.number_8 = self.lineEdit_8.text() self.number_9 = self.lineEdit_9.text() self.number_10 = self.lineEdit_10.text() self.number_11 = self.lineEdit_11.text() self.number_12 = self.lineEdit_12.text() self.key_task_crypto(key_pub) def key_task_crypto(self, key_pub): self.number_1_crypto = rsa.encrypt(self.number_1.encode('utf8'), key_pub) self.number_2_crypto = rsa.encrypt(self.number_2.encode('utf8'), key_pub) self.number_3_crypto = rsa.encrypt(self.number_3.encode('utf8'), key_pub) self.number_4_crypto = rsa.encrypt(self.number_4.encode('utf8'), key_pub) self.number_5_crypto = rsa.encrypt(self.number_5.encode('utf8'), key_pub) self.number_6_crypto = rsa.encrypt(self.number_6.encode('utf8'), key_pub) self.number_7_crypto = rsa.encrypt(self.number_7.encode('utf8'), key_pub) self.number_8_crypto = rsa.encrypt(self.number_8.encode('utf8'), key_pub) self.number_9_crypto = rsa.encrypt(self.number_9.encode('utf8'), key_pub) self.number_10_crypto = rsa.encrypt(self.number_10.encode('utf8'), key_pub) self.number_11_crypto = rsa.encrypt(self.number_11.encode('utf8'), key_pub) self.number_12_crypto = rsa.encrypt(self.number_12.encode('utf8'), key_pub) self.load_key_task_crypto() def load_key_task_crypto(self): k = [self.number_1_crypto, self.number_2_crypto, self.number_3_crypto, self.number_4_crypto, self.number_5_crypto, self.number_6_crypto, self.number_7_crypto, self.number_8_crypto, self.number_9_crypto, self.number_10_crypto, self.number_11_crypto, self.number_12_crypto] directory_save_key = self.directory_key_check + self.name_file_key with open(directory_save_key, "w") as f: f.write("\n".join(base64.b64encode(item).decode('utf8') for item in k)) msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText("Информация") msg.setInformativeText('Данные ключей ответов сохранены') msg.setWindowTitle("Информация") msg.exec_() def app_key_task(self): if not os.path.exists('key_priv.pem'): msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText("Ошибка") msg.setInformativeText('ВНИМАНИЕ! Приватный ключ не найден' 'Попробуйте сгенерировать новый ключ.') msg.setWindowTitle("Ошибка") msg.exec_() return with open('key_priv.pem', "rb") as f: _key_priv = f.read() key_priv = self.key_priv.load_pkcs1(_key_priv) directory_file, _ = QFileDialog.getOpenFileName(None, ".", "*.txt") if not directory_file: return with open(directory_file, "r") as f: lines = f.readlines() for line in lines: decrypted = rsa.decrypt(base64.b64decode(line.strip()), key_priv) self.answers.append(decrypted.decode('utf8')) name_file = os.path.basename(directory_file) directory_file = os.path.dirname(directory_file) + "/" self.lineEdit.setText(self.answers[0]) self.lineEdit_2.setText(self.answers[1]) self.lineEdit_3.setText(self.answers[2]) self.lineEdit_4.setText(self.answers[3]) self.lineEdit_5.setText(self.answers[4]) self.lineEdit_6.setText(self.answers[5]) self.lineEdit_7.setText(self.answers[6]) self.lineEdit_8.setText(self.answers[7]) self.lineEdit_9.setText(self.answers[8]) self.lineEdit_10.setText(self.answers[9]) self.lineEdit_11.setText(self.answers[10]) self.lineEdit_12.setText(self.answers[11]) self.lineEdit_14.setText(directory_file) self.lineEdit_16.setText(name_file) def func_generate_keys(self): save_key_pub = self.key_pub.save_pkcs1() with open('key_pub.pem', "wb") as f: f.write(save_key_pub) save_key_priv = self.key_priv.save_pkcs1() with open('key_priv.pem', "wb") as f: f.write(save_key_priv) msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText("Информация") msg.setInformativeText('Ключи шифрования и дешифровки созданны.' 'Отправте публичный ключ участникам ОГЭ') msg.setWindowTitle("Информация") msg.exec_() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) app.setStyle("Fusion") w = MainWindow() w.show() sys.exit(app.exec_()) 

crypto.py: https://drive.google.com/file/d/1WOF20K3ulmFt0HorWf0Nj8CADTzUAX3l/view?usp=sharing Update: Если упростить задачу и исключить дешифрование файлов, то можно представить так, на входе получаем список с переменными, в которых хранятся данные из строк, выглядит это примерно так:

Первые 12 переменных-это и есть ответы на задание, дальше идет информация о том, кто делал работу, дд.мм.гг, регион, код ОО, номер класса, литера класса, код ППЭ, номер аудитории, номер варианта, код предмета, название предмета, номер КИМ, фамилия, имя, отчество, серия(паспорта), номер(паспорта).

Каждый из пунктов перечисленных выше, находится на отдельных строчках. Что бы начать проверку, нужно указать директорию где находятся файлы для проверки, после чего указать директорию куда сохранятся проверенные файлы и ввести в поля lineEdit правильные ответы, и в конце нажать на кнопку «Начать проверку», после чего программа переберет все файлы и в директории сохранения проверенных файлов будет создан новый текстовый файл по каждой работе, пример вывода данных:

№1: 0, №2: 1, №3: 1, №4: 1, №5: 0, №6: 0, №7: 0, №8: 0, №9: 1, №10: 1, №11: 1, №12: 1 №1: 120/№1: 120, №2: 1/№2: 1 *(так выводится правильная и неправильная комбинация, то есть первое число-это то, что ввел экзаменуемый, а второе число-это правильный ответ)* 

Ниже располагаются остальные данные, перечисленные выше. main.py:

from PyQt5 import QtCore, QtGui, QtWidgets from FOTO import Ui_MainWindow from PyQt5.Qt import * class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_()) 

ver.py:

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ver.ui' # # Created by: PyQt5 UI code generator 5.15.6 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(320, 484) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setObjectName("lineEdit_3") self.gridLayout.addWidget(self.lineEdit_3, 10, 1, 1, 1) self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setObjectName("lineEdit_2") self.gridLayout.addWidget(self.lineEdit_2, 11, 1, 1, 1) self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setObjectName("lineEdit") self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) self.label_11 = QtWidgets.QLabel(self.centralwidget) self.label_11.setObjectName("label_11") self.gridLayout.addWidget(self.label_11, 6, 0, 1, 1) self.label_15 = QtWidgets.QLabel(self.centralwidget) self.label_15.setObjectName("label_15") self.gridLayout.addWidget(self.label_15, 10, 0, 1, 1) self.label_14 = QtWidgets.QLabel(self.centralwidget) self.label_14.setObjectName("label_14") self.gridLayout.addWidget(self.label_14, 9, 0, 1, 1) self.label_13 = QtWidgets.QLabel(self.centralwidget) self.label_13.setObjectName("label_13") self.gridLayout.addWidget(self.label_13, 8, 0, 1, 1) self.label_12 = QtWidgets.QLabel(self.centralwidget) self.label_12.setObjectName("label_12") self.gridLayout.addWidget(self.label_12, 7, 0, 1, 1) self.lineEdit_7 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_7.setObjectName("lineEdit_7") self.gridLayout.addWidget(self.lineEdit_7, 1, 1, 1, 1) self.label_16 = QtWidgets.QLabel(self.centralwidget) self.label_16.setObjectName("label_16") self.gridLayout.addWidget(self.label_16, 11, 0, 1, 1) self.lineEdit_14 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_14.setObjectName("lineEdit_14") self.gridLayout.addWidget(self.lineEdit_14, 4, 1, 1, 1) self.lineEdit_13 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_13.setObjectName("lineEdit_13") self.gridLayout.addWidget(self.lineEdit_13, 3, 1, 1, 1) self.lineEdit_15 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_15.setObjectName("lineEdit_15") self.gridLayout.addWidget(self.lineEdit_15, 5, 1, 1, 1) self.lineEdit_12 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_12.setObjectName("lineEdit_12") self.gridLayout.addWidget(self.lineEdit_12, 2, 1, 1, 1) self.lineEdit_16 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_16.setObjectName("lineEdit_16") self.gridLayout.addWidget(self.lineEdit_16, 6, 1, 1, 1) self.lineEdit_18 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_18.setObjectName("lineEdit_18") self.gridLayout.addWidget(self.lineEdit_18, 8, 1, 1, 1) self.lineEdit_19 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_19.setObjectName("lineEdit_19") self.gridLayout.addWidget(self.lineEdit_19, 9, 1, 1, 1) self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.lineEdit_17 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_17.setObjectName("lineEdit_17") self.gridLayout.addWidget(self.lineEdit_17, 7, 1, 1, 1) self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) self.label = QtWidgets.QLabel(self.centralwidget) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1) self.label_10 = QtWidgets.QLabel(self.centralwidget) self.label_10.setObjectName("label_10") self.gridLayout.addWidget(self.label_10, 5, 0, 1, 1) self.label_9 = QtWidgets.QLabel(self.centralwidget) self.label_9.setObjectName("label_9") self.gridLayout.addWidget(self.label_9, 4, 0, 1, 1) self.lineEdit_32 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_32.setObjectName("lineEdit_32") self.gridLayout.addWidget(self.lineEdit_32, 12, 1, 1, 1) self.label_17 = QtWidgets.QLabel(self.centralwidget) self.label_17.setObjectName("label_17") self.gridLayout.addWidget(self.label_17, 12, 0, 1, 1) self.lineEdit_33 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_33.setObjectName("lineEdit_33") self.gridLayout.addWidget(self.lineEdit_33, 13, 1, 1, 1) self.label_18 = QtWidgets.QLabel(self.centralwidget) self.label_18.setObjectName("label_18") self.gridLayout.addWidget(self.label_18, 13, 0, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setObjectName("pushButton") self.gridLayout_2.addWidget(self.pushButton, 1, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_11.setText(_translate("MainWindow", "7")) self.label_15.setText(_translate("MainWindow", "11")) self.label_14.setText(_translate("MainWindow", "10")) self.label_13.setText(_translate("MainWindow", "9")) self.label_12.setText(_translate("MainWindow", "8")) self.label_16.setText(_translate("MainWindow", "12")) self.label_3.setText(_translate("MainWindow", "2")) self.label_2.setText(_translate("MainWindow", "3")) self.label.setText(_translate("MainWindow", "1")) self.label_4.setText(_translate("MainWindow", "4")) self.label_10.setText(_translate("MainWindow", "6")) self.label_9.setText(_translate("MainWindow", "5")) self.label_17.setText(_translate("MainWindow", "

Директория файлов

для проверки

")) self.label_18.setText(_translate("MainWindow", "

Директория

провереных файлов

")) self.pushButton.setText(_translate("MainWindow", "Начать проверку")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())

Как использовать «с» в Python для открытия файлов (включая примеры)

Как использовать «с» в Python для открытия файлов (включая примеры)

Вы можете использовать следующий синтаксис, чтобы открыть файл в Python, сделать с ним что-то, а затем закрыть файл:

file = open('my_data.csv') df = file.read() print(df) file.close () 

Проблема с этим подходом в том, что очень легко забыть закрыть файл.

Лучше использовать с open , который использует следующий базовый синтаксис:

with open('my_data.csv') as file: df = file.read() print(df) 

При таком подходе файл, с которым вы работаете, автоматически закрывается, поэтому вам не нужно помнить об использовании file.close() .

В следующих примерах показано, как использовать open в различных сценариях.

Пример 1. Использование оператора With для чтения файла

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

with open('my_data.csv') as file: df = file.read() print(df) ,points,assists,rebounds 0,11,5,6 1,17,7,8 2,16,7,8 3,18,9,10 4,22,12,14 5,25,9,12 6,26,9,12 7,24,4,10 8,29,8,11 

Содержимое файла печатается, и файл автоматически закрывается без ввода нами file.close() .

Пример 2: Использование оператора With для записи файла

В следующем коде показано, как использовать оператор with для записи текста в файл:

with open('data_out.csv', 'w') as file: file.write('Some text to write to CSV file') 

Обратите внимание, что ‘ w ‘ в операторе open() указывает Python использовать режим «записи» с файлом, а не режим чтения.

Пример 3. Использование оператора With для чтения и записи файлов

Мы также можем открыть несколько файлов одновременно с помощью одного оператора with.

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

with open('my_data.csv', 'r') as infile, open('data_out.csv', 'w') as outfile: for line in infile: outfile.write (line) 

Если мы перейдем к месту, где мы написали «data_out.csv», мы сможем просмотреть содержимое файла:

Обратите внимание, что мы можем использовать функцию open() для открытия любого количества файлов в рамках одного оператора with.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в Python:

Как разделить исходный код python на несколько файлов?

Пишу код на python и столкнулся с такой проблемой, что он получается очень большой. Как я могу, к примеру, вынести команду в отдельный файл.

  • Вопрос задан более трёх лет назад
  • 11150 просмотров

1 комментарий

Простой 1 комментарий

shabelski89

Александр @shabelski89

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *