Python 使用QFileSystemWatcher在生成数据文件时导入数据文件的更好方法?

Python 使用QFileSystemWatcher在生成数据文件时导入数据文件的更好方法?,python,qt,pyqt4,qfilesystemwatcher,Python,Qt,Pyqt4,Qfilesystemwatcher,我正在使用PyQt4编写一个应用程序,该应用程序监视文件夹,并在收集数据时导入数据(包含在子文件夹中),以便在生成数据时对其运行分析 从本质上讲,数据收集软件的工作方式是生成一个文件夹,将数据文件放在其中。在该文件夹中,它放置了几个文件-不同的.xml文件,其中包含软件的不同配置参数以及实际数据文件,保存为.csv文件 我已经编写了一个小测试应用程序(如下),它能够监视文件夹,查找添加的子文件夹,然后监视这些子文件夹中的文件更改,以便导入数据。然而,我不确定我是否会用最好的方法来解决这个问题。特

我正在使用PyQt4编写一个应用程序,该应用程序监视文件夹,并在收集数据时导入数据(包含在子文件夹中),以便在生成数据时对其运行分析

从本质上讲,数据收集软件的工作方式是生成一个文件夹,将数据文件放在其中。在该文件夹中,它放置了几个文件-不同的.xml文件,其中包含软件的不同配置参数以及实际数据文件,保存为.csv文件

我已经编写了一个小测试应用程序(如下),它能够监视文件夹,查找添加的子文件夹,然后监视这些子文件夹中的文件更改,以便导入数据。然而,我不确定我是否会用最好的方法来解决这个问题。特别是,由于添加了多个文件,因此我必须筛选所需文件的添加内容(通常我只需要1个xml文件和1个数据文件,其他内容是无关的)

此外,这可能是更大的问题-数据文件本身开始时是另一个文件(只是一个临时文件),数据采集软件在记录结束时将其转换为相应的.csv文件(临时文件随后被删除)。生成.csv文件时发出的directoryChanged信号发生在转换之后,但在文件完全写入之前(有时-这是事情变得有点模糊的地方)。我的意思是,有时候,如果我在信号发出时导入数据,那么整个数据集都会被导入。其他时候,只导入一部分(例如前200行)。但是,如果我等待下一个directoryChanged信号,我会得到整个数据集。不过,我不太确定如何等待下一个信号。我可能会使用计数器(与我使用switch在True和False之间跳转的方式相同),但这似乎相当笨拙(与我当前使用“switch”的实现在我看来非常笨拙的方式相同)

这可能不清楚,所以我在下面提供了一个示例输出。上面写着“导入数据”,这就是我导入功能的地方。这就是有时候我得到完整数据集的地方,而有时候我只得到其中的一部分

我只是想知道是否有更好的方法来做这件事,因为这是我第一次通过(阅读:猜测)如何做这件事

代码:

class FileWatcher(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.resize(160, 160)

        self.data_folder = None
        self.current_xml = None
        self.vr_csv = None
        self.watch_path = []
        self.watch_folder = None
        self.switch = False
        self.counter = 1

        layout = QtGui.QVBoxLayout(self)

        self.start_btn = QtGui.QPushButton("Start")
        self.start_btn.clicked.connect(self.start_watching)

        self.stop_btn = QtGui.QPushButton("Stop")
        self.stop_btn.clicked.connect(self.stop_watching)

        layout.addWidget(self.start_btn)
        layout.addWidget(self.stop_btn)

    def start_watching(self):
        folder = QtGui.QFileDialog.getExistingDirectory(self)
        self.watch_path.append(folder)
        self.watch_folder = QtCore.QFileSystemWatcher(self.watch_path)
        self.watch_folder.directoryChanged.connect(self.directory_changed)

    def stop_watching(self):
        self.data_folder = None
        self.current_xml = None
        self.vr_csv = None
        self.watch_path = []
        self.watch_folder = None
        self.switch = False
        self.counter = 1

    def data_folder_changed(self, path):

        print("data_folder_changed: %s" % self.counter)
        self.counter += 1

        xml_files = glob(path + "\\*VoltageRecording*.xml")
        csv_files = glob(path + "\\*VoltageRecording*.csv")

        if any(xml_files):
            if self.current_xml != xml_files[-1]:
                self.current_xml = xml_files[-1]
                print(self.current_xml.split('\\')[-1])

                vals = pxml.parse_vr(self.current_xml)
                self.vr_csv = os.path.join(path, vals['voltage recording file'] + '.csv')
                print(self.vr_csv.split('\\')[-1])

        if any(csv_files):
            if self.vr_csv == csv_files[-1]:
                print("switch: %s" % self.switch)

                if self.switch and self.vr_csv is not None:
                    print("Import Data")
                    print(self.vr_csv.split('\\')[-1])
                    self.switch = False
                    self.vr_csv = None

                else:
                    self.switch = True

        print()

    def directory_changed(self, path):
        data_folder_path = [glob(path+"/*")[-1], ]
        print("directory_changed")
        print(data_folder_path)
        print()

        self.data_folder = QtCore.QFileSystemWatcher(data_folder_path)
        self.data_folder.directoryChanged.connect(self.data_folder_changed)
输出示例(3个周期,因此将导入3个数据文件):


有一个python库,从外观上看,它有更详细的事件,您可以使用它更准确地判断它是什么类型的事件。我在几个项目中使用过它,没有任何问题,其中一个项目使用PySide

directory_changed
['C:\\Users\\User\\Desktop\\Test_watch\\Test-001']

data_folder_changed: 1

data_folder_changed: 2

data_folder_changed: 3
Test-001_Cycle00001_VoltageRecording_001.xml
Test-001_Cycle00001_VoltageRecording_001.csv

data_folder_changed: 4

data_folder_changed: 5

data_folder_changed: 6
switch: False

data_folder_changed: 7
switch: True
Import Data
Test-001_Cycle00001_VoltageRecording_001.csv

data_folder_changed: 8

data_folder_changed: 9
Test-001_Cycle00002_VoltageRecording_001.xml
Test-001_Cycle00002_VoltageRecording_001.csv

data_folder_changed: 10

data_folder_changed: 11

data_folder_changed: 12
switch: False

data_folder_changed: 13
switch: True
Import Data
Test-001_Cycle00002_VoltageRecording_001.csv

data_folder_changed: 14
Test-001_Cycle00003_VoltageRecording_001.xml
Test-001_Cycle00003_VoltageRecording_001.csv

data_folder_changed: 15

data_folder_changed: 16

data_folder_changed: 17

data_folder_changed: 18
switch: False

data_folder_changed: 19
switch: True
Import Data
Test-001_Cycle00003_VoltageRecording_001.csv

data_folder_changed: 20