Python 如何检查CSV文件是否未被其他进程使用?
我随身带着一个传感器,可以感知数据并积累数据,并定期将其放入CSV文件(每次创建新的CSV文件时) 我正在使用WatchdogAPI将手表放在新生成的CSV文件上。每次我尝试使用“read_CSV()”函数读取新生成的CSV文件时,我都无法读取该文件。我知道这是因为我的传感器首先创建了临时文件,如下面的屏幕截图所示: 我认为pandas read_csv()函数在将传感器数据放入文件后完全关闭之前无法读取该文件 关于如何读取CSV文件有什么建议吗?或者检查文件是否已完全关闭 我的代码:Python 如何检查CSV文件是否未被其他进程使用?,python,python-3.x,pandas,csv,python-watchdog,Python,Python 3.x,Pandas,Csv,Python Watchdog,我随身带着一个传感器,可以感知数据并积累数据,并定期将其放入CSV文件(每次创建新的CSV文件时) 我正在使用WatchdogAPI将手表放在新生成的CSV文件上。每次我尝试使用“read_CSV()”函数读取新生成的CSV文件时,我都无法读取该文件。我知道这是因为我的传感器首先创建了临时文件,如下面的屏幕截图所示: 我认为pandas read_csv()函数在将传感器数据放入文件后完全关闭之前无法读取该文件 关于如何读取CSV文件有什么建议吗?或者检查文件是否已完全关闭 我的代码: imp
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)
是的,在文件关闭之前,您可能正在阅读它-您是否尝试过在正确的目录中创建文件,但文件名是观察者看不到的(即没有.csv扩展名),然后关闭后重命名文件,以便观察者看到文件时文件已完成?@barny否,我没有。让我试试,我会告诉你的。@barny相同的错误“文件未准备好[Errno 2]文件b'C:/Users/viral/Desktop/Sample\\998\u 20190420T060513.txt”不存在:b'C:/Users/viral/Desktop/Sample\\998\u 20190420T060513.txt”我将文件从CSV更改为TXT,然后我将其放入目录中,然后将扩展名从TXT更改为CSV,得到了上面提到的错误。您的代码不应该试图读取.TXT文件。请在问题中编辑完整的错误消息。并将所有这些
更改为e
以使它们引发而不是继续,这很可能隐藏了真正的错误。