我正在使用 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