Форум сайта python.su
Доброго времени суток!
Ищу функцию, которая будет давать сигнал при добавлении нового файла в конкретной папке.
Функция моей мечты выглядит следующим образом:
directory = "C:\Folder1\Folder2\Folder3" self.QDir(directory).direcrion.entryList().countChanged.connect(self.MyFunction)
Офлайн
Вот мой вариант, который у меня получился:
import sys from PyQt5 import QtWidgets from PyQt5.QtCore import QDir, QTimer import Testwin_1 folder = r"C:\######\########\#########\Myfolder" list = [] class Testing_1(QtWidgets.QMainWindow, Testwin_1.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.setWindowTitle("Testing") self.init_UI() def init_UI(self): global list direcrion = QDir(folder) templist = direcrion.entryList() for file in templist: if "." in file: if file.split(".")[len(file.split("."))-1].lower() == "xls": list.append(file) self.timer = QTimer() self.timer.timeout.connect(self.Refresh) self.timer.start(5000) def Refresh(self): global list direcrion = QDir(folder) templist = direcrion.entryList() for file in templist: if "." in file: if file.split(".")[len(file.split("."))-1].lower() == "xls": if not file in list: print("Новый XML: ",file)#########Вместо этой функции будут функции обработки данного файла list = templist break self.timer.start(5000) def main(): app = QtWidgets.QApplication(sys.argv) window = Testing_1() window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
Офлайн
Temp Уже поздно, поэтому общие советы.
Вам нужно мониторить события файловой системы.
Поскольку у вас венда, вам или нужно вешать свой хук на события венды касающиеся ФС, да вобщем под линуксом примерно тоже самое, если мы говорим про общие принципы.
Или воспользваться готовой либой типа вочдог https://blog.magrathealabs.com/filesystem-events-monitoring-with-python-9f5329b651c3
Если используете QT там есть своя “ сторожевая собака” QFileSystemWatcher https://doc.qt.io/qt-5/qfilesystemwatcher.html и никаких костылей не нужно городить.
[code python][/code]
Отредактировано PEHDOM (Март 5, 2021 00:01:48)
Офлайн
PEHDOM
PEHDOMСпасибо за информацию.
Temp Уже поздно, поэтому общие советы.Вам нужно мониторить события файловой системы. Поскольку у вас венда, вам или нужно вешать свой хук на события венды касающиеся ФС, да вобщем под линуксом примерно тоже самое, если мы говорим про общие принципы.Или воспользваться готовой либой типа вочдог https://blog.magrathealabs.com/filesystem-events-monitoring-with-python-9f5329b651c3Если используете QT там есть своя “ сторожевая собака” QFileSystemWatcher https://doc.qt.io/qt-5/qfilesystemwatcher.html и никаких костылей не нужно городить.
fs_watcher = QFileSystemWatcher(['C:\\Folder']) fs_watcher.directoryChanged.connect(self.directory_changed)
Прикреплённый файлы:
Снимок экрана 2021-03-05 211102.jpg (13,1 KБ)
Офлайн
Офлайн
TempХЗ, может у вас “с” или “о” на кирилице.Все работает.
вот только у меня “.connect” выделяется ошибкой
Tempв смысле? оно отслеживает появление/исчезновения нового файла. Если в папке появляется/удаляется файл он передаеет имя папки в которой произошли изменения. Дальше вам нужно найти новый файл, например по времени создания, зная время получения сигнала. По крайней мере так вы не будете дрочить папку каждые 5 секунд, а будете это делать только когда нужно.
Судя по функционалу QFileSystemWatcher, можно лишь отслеживать изменение и удаление файлов и папок (заранее добавленных через addPath или addPaths), но никак не отслеживать появление нового файла
[code python][/code]
Отредактировано PEHDOM (Март 6, 2021 16:41:26)
Офлайн
PEHDOMнаписано на латинице, проверял копированием из примеров с интернета(((
ХЗ, может у вас “с” или “о” на кирилице.Все работает.
Офлайн
да вроде да, вот это код вполне себе отрабатывает, правда там для pyqt4, пятого под рукой нет..
import sys from PyQt4 import QtGui from PyQt4 import QtCore folder = 'd:\\TEMP' def folder_event(string): print(string) app = QtGui.QApplication(sys.argv) mw= QtGui.QWidget() mw.show() fs_watcher = QtCore.QFileSystemWatcher([folder,]) fs_watcher.directoryChanged.connect(folder_event) sys.exit(app.exec_())
[code python][/code]
Отредактировано PEHDOM (Март 6, 2021 18:31:29)
Офлайн
PEHDOM
да вроде да, вот это код вполне себе отрабатывает, правда там для pyqt4, пятого под рукой нет..
import sys from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QWidget folder = 'd:\\TEMP' def folder_event(string): print(string) app = QApplication(sys.argv) mw = QWidget() mw.show() fs_watcher = QtCore.QFileSystemWatcher([folder,]) fs_watcher.directoryChanged.connect(folder_event) sys.exit(app.exec_())
Офлайн
поставил себе pyqt5, все работает, ничего не подсвечивает, python3.7 x32, PyQt5-5.15.3
создал пустой файл, потом удалил его. в консоль вывелось 2 сообщения.
попробуйте запустить не из ИДЕ , а из консоли.
[code python][/code]
Отредактировано PEHDOM (Март 6, 2021 20:45:42)
Прикреплённый файлы:
Безымянный.png (24,8 KБ)
Офлайн