首页 > 解决方案 > 如何检查 CSV 文件是否未被其他进程使用?

问题描述

我有一个传感器,它可以感知数据并将其累积并定期将其放入 CSV 文件中(每次制作新的 CSV 文件时)。

我正在使用看门狗 API 监视新生成的 CSV 文件。每次我尝试使用 pandas“read_csv()”函数读取新生成的 CSV 文件时,但不知何故我无法读取该文件。我知道这是因为我的传感器首先创建了临时文件,如下面的屏幕截图所示: 在此处输入图像描述

我认为 pandas read_csv() 函数在将传感器数据放入文件后完全关闭之前无法读取文件。

有关如何读取 CSV 文件的任何建议?或者像检查文件是否已完全关闭。

我的代码:

import os
import pandas as pd
from PyQt5 import QtCore, QtWidgets
from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer
from Append_Function import append_df_to_excel
import time


class Emitter(QtCore.QObject):
    newDataFrameSignal = QtCore.pyqtSignal(pd.DataFrame)


class Watcher:
    def __init__(self):
        self.watch_dir = os.getcwd()
    self.directory_to_watch = None
    self.emitter = Emitter()
    self.observer = Observer()
    self.event_handler = Handler(
        emitter=self.emitter,
        patterns=["*.CSV"],
        ignore_patterns=["*.tmp"],
        ignore_directories=True
    )

def set_filename(self, filename):
    self.directory_to_watch = os.path.join(self.watch_dir, filename)

def run(self):
    self.observer.schedule(self.event_handler, self.directory_to_watch, recursive=False)
    self.observer.start()

def stop_watcher(self):
    self.observer.stop()


class Handler(PatternMatchingEventHandler):
def __init__(self, *args, emitter=None, **kwargs):
    super(Handler, self).__init__(*args, **kwargs)
    self._emitter = emitter
    self.file_name = time.strftime("%Y%m%d-%H%M%S")+".xlsx"

def on_any_event(self, event):
    done_flag = False
    if event.is_directory:
        return None
    elif event.event_type == 'created':
        # Take any action here when a file is first created.
        print("Received created event - %s." % event.src_path)

        if os.path.isfile(os.path.join(os.getcwd(), self.file_name)):
            try:
                df = pd.read_csv(event.src_path)
                append_df_to_excel(os.path.join(os.getcwd(), self.file_name),
                                       pd.read_csv(event.src_path, index_col=0))
                self._emitter.newDataFrameSignal.emit(df.copy())
                df.set_index(df.columns.values.tolist()[0], inplace=True)

            except Exception as e:
                print("File not ready", e)
        else:
            try:
                df = pd.read_csv(event.src_path)
                append_df_to_excel(os.path.join(os.getcwd(), self.file_name),
                                   pd.read_csv(event.src_path, index_col=0))
                self._emitter.newDataFrameSignal.emit(df.copy())
                df.set_index(df.columns.values.tolist()[0], inplace=True)

            except Exception as e:
                print("File not ready", e)

    elif event.event_type == 'modified':
        print("Modified created event - %s." % event.src_path)

        try:
            df = pd.read_csv(event.src_path)
            append_df_to_excel(os.path.join(os.getcwd(), self.file_name),
                               pd.read_csv(event.src_path, index_col=0))
            self._emitter.newDataFrameSignal.emit(df.copy())
            df.set_index(df.columns.values.tolist()[0], inplace=True)

        except Exception as e:
            print("File not ready", e)
    else:

        try:
            df = pd.read_csv(event.src_path)
            append_df_to_excel(os.path.join(os.getcwd(), self.file_name),
                               pd.read_csv(event.src_path, index_col=0))
            self._emitter.newDataFrameSignal.emit(df.copy())
            df.set_index(df.columns.values.tolist()[0], inplace=True)

        except Exception as e:
            print("File not ready", e)


class DataFrameTableWidget(QtWidgets.QTableWidget):

@QtCore.pyqtSlot(pd.DataFrame)
def append_dataframe(self, df):
    df = df.copy()
    df = df.astype('float64', errors='ignore')
    df = df.round(decimals=2)
    if df.columns.size > self.columnCount():
        self.setColumnCount(df.columns.size)
    r = self.rowCount()
    if r == 0:
        self.insertRow(r)
        for c, column in enumerate(df):
            it = QtWidgets.QTableWidgetItem(column)
            self.setItem(r, c, it)
    i = self.rowCount()
    for r, row in df.iterrows():
        self.insertRow(self.rowCount())
        for c, (column, value) in enumerate(row.iteritems()):
            it = QtWidgets.QTableWidgetItem(str(value))
            self.setItem(i + r, c, it)

标签: pythonpython-3.xpandascsvpython-watchdog

解决方案


推荐阅读