问题描述
我一直在使用看门狗和json作为脚本,在其中我监视要创建的文件和json以读取已创建的文件。该脚本很简单:
import watchdog.events
import watchdog.observers
import json
def on_created(self,event):
with open(event.src_path,'r') as f:
print(f.read())
data = json.load(f)
def main(self):
observer = watchdog.observers.Observer()
observer.schedule(NotificationsEvent(),path=os.path.split(self.notificationFlag)[0],recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
基本上是在创建带有json路径的新文件时。读取它,然后将其作为json加载,并且效果很好,但有时会抛出一个错误:
期望值:第1行第1列(字符0)
当我检查返回我的f.read()
的印刷品时:
{
"delay": 0,"image": "https://secure-images.nike.com/is/image/DotCom/CK9388_484","keyword": false,"link": "https://www.nike.com/se/t/traningssko-metcon-6-78352H/CK9388-484","name": "NIKE METCON 6","price": "1337","shortcut": [
"[Checkout](https://www.nike.com/se/cart)"
],"sizes": [],"sku": "CK9388-100","store": "Nike","text": "New!","webhook": "nike"
}
我已经使用https://jsonlint.com/来查看它是否有效并且有效,但是有时我还是会收到错误消息。我确实得到50分之一。我无法再次再现该错误,它很少发生,但是确实发生了。
我不知道,我已经不知道可能是什么原因引起的:(
感谢所有帮助!
解决方法
f.read()
正在读取整个文件,因此json.load()
没什么可读取的。
您应该读入变量,然后使用json.loads()
。
def on_created(self,event):
with open(event.src_path,'r') as f:
js = f.read()
print(js)
data = json.loads(js)
或者您可以在它们之间倒回文件。
def on_created(self,'r') as f:
print(f.read())
f.seek(0)
data = json.load(f)
如果在没有print(f.read())
行的情况下遇到错误,则问题是您的代码在编写器完成写入文件之前就已运行。
实际上并没有可靠的方法来告诉编写者何时完成了文件写入。最好的解决方案是让它自动创建文件。它应该将数据写入另一个文件,然后将该文件重命名为您的代码正在监视的文件。
您可以将循环与try/except
def on_created(self,event):
for _ in range(5): // limit the number of retries
try:
with open(event.src_path,'r') as f:
data = json.load(f)
break
except JsonDecodeError:
print("JSON load error,retrying")
os.sleep(1) // allow time for writer to finish