Python 使用QFileSystemWatcher在生成数据文件时导入数据文件的更好方法?
我正在使用PyQt4编写一个应用程序,该应用程序监视文件夹,并在收集数据时导入数据(包含在子文件夹中),以便在生成数据时对其运行分析 从本质上讲,数据收集软件的工作方式是生成一个文件夹,将数据文件放在其中。在该文件夹中,它放置了几个文件-不同的.xml文件,其中包含软件的不同配置参数以及实际数据文件,保存为.csv文件 我已经编写了一个小测试应用程序(如下),它能够监视文件夹,查找添加的子文件夹,然后监视这些子文件夹中的文件更改,以便导入数据。然而,我不确定我是否会用最好的方法来解决这个问题。特别是,由于添加了多个文件,因此我必须筛选所需文件的添加内容(通常我只需要1个xml文件和1个数据文件,其他内容是无关的) 此外,这可能是更大的问题-数据文件本身开始时是另一个文件(只是一个临时文件),数据采集软件在记录结束时将其转换为相应的.csv文件(临时文件随后被删除)。生成.csv文件时发出的directoryChanged信号发生在转换之后,但在文件完全写入之前(有时-这是事情变得有点模糊的地方)。我的意思是,有时候,如果我在信号发出时导入数据,那么整个数据集都会被导入。其他时候,只导入一部分(例如前200行)。但是,如果我等待下一个directoryChanged信号,我会得到整个数据集。不过,我不太确定如何等待下一个信号。我可能会使用计数器(与我使用switch在True和False之间跳转的方式相同),但这似乎相当笨拙(与我当前使用“switch”的实现在我看来非常笨拙的方式相同) 这可能不清楚,所以我在下面提供了一个示例输出。上面写着“导入数据”,这就是我导入功能的地方。这就是有时候我得到完整数据集的地方,而有时候我只得到其中的一部分 我只是想知道是否有更好的方法来做这件事,因为这是我第一次通过(阅读:猜测)如何做这件事 代码:Python 使用QFileSystemWatcher在生成数据文件时导入数据文件的更好方法?,python,qt,pyqt4,qfilesystemwatcher,Python,Qt,Pyqt4,Qfilesystemwatcher,我正在使用PyQt4编写一个应用程序,该应用程序监视文件夹,并在收集数据时导入数据(包含在子文件夹中),以便在生成数据时对其运行分析 从本质上讲,数据收集软件的工作方式是生成一个文件夹,将数据文件放在其中。在该文件夹中,它放置了几个文件-不同的.xml文件,其中包含软件的不同配置参数以及实际数据文件,保存为.csv文件 我已经编写了一个小测试应用程序(如下),它能够监视文件夹,查找添加的子文件夹,然后监视这些子文件夹中的文件更改,以便导入数据。然而,我不确定我是否会用最好的方法来解决这个问题。特
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