python - 如何检查 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)
解决方案
推荐阅读
- javascript - 在 AUI 脚本中序列化 serialize() 参数
- vue.js - vue中CKEditor 4中的html5audio插件
- python-3.x - 如何处理在 Django 中使用表单上传的文件?
- android - Kotlin Flow“首次离线”方法
- c++ - 什么是 Cmake 文件以及为什么我们在拥有 VIsual Studio 时使用它
- php - 按下按钮时传递动态变量
- c# - Buffer.BlockCopy - 对象必须是基元数组
- android - 使用导航组件时按下后退按钮退出应用程序而不是导航到上一个屏幕
- ios - 无法添加 Mapbox 和 MapboxNavigation SDK
- angular - 在没有应用程序运行的情况下处理 SwPush 通知操作