1

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

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

我编写了一个小测试应用程序(如下),它能够查看文件夹、查找添加的子文件夹,然后查看这些子文件夹中的文件更改,以便可以导入数据。但是,我不确定我是否是最好的方法。特别是,由于添加了多个文件,我必须筛选我需要添加的文件和不添加的文件(通常我只需要 1 个 xml 文件和 1 个数据文件,其他位是无关的)。

此外,这可能是更大的问题 - 数据文件本身作为另一个文件(只是一个临时文件)开始,然后数据采集软件在记录结束时将其转换为相应的 .csv 文件(临时文件然后已删除)。生成 .csv 文件时发出的 directoryChanged 信号发生在转换之后,但在文件完全写入之前(有时 - 这是事情变得有点模糊的地方)。我的意思是,有时,如果我在发出该信号时导入数据,则会导入整个数据集。其他时候,只导入一部分(例如前 200 行)。但是,如果我等待下一个 directoryChanged 信号,我会得到整个数据集。不过,我不太确定如何专门等待下一个信号。

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

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

代码:

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 个数据文件):

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
4

1 回答 1

0

有一个名为watchdog的 Python 库,从外观上看,它具有更详细的事件,您可以使用这些事件更准确地判断它是什么类型的事件。我已经在几个没有问题的项目中使用过它,其中一个使用 PySide (for reference)

于 2015-01-09T15:30:21.303 回答