【问题标题】:Open and read latest json file one time only仅一次打开并读取最新的 json 文件
【发布时间】:2020-05-02 02:07:43
【问题描述】:

SO 成员...我如何才能一次读取目录中的最新 json 文件(如果没有新文件打印某些内容)。到目前为止,我只能读取最新的文件...下面的示例脚本(每 45 分钟运行一次)打开并读取目录中的最新 json 文件。在这种情况下,最新文件是 file3.json(每 30 分钟创建一次 json 文件)。因此,如果 file4 由于某种原因没有创建(例如服务器无法创建新的 json 文件)。如果脚本再次运行.. 它仍将读取相同的最后一个文件 3。

目录中的文件

file1.json
file2.json
file3.json

下面的脚本可以打开和读取目​​录中创建的最新的json文件。

import glob
import os
import os.path
import datetime, time

listFiles = glob.iglob('logFile/*.json') 
latestFile = max(listFiles, key=os.path.getctime)
with open(latestFile, 'r') as f:
   mydata = json.load(f)
   print(mydata)

为了确保脚本只会读取最新的文件并且只读取最新的文件一次...请看下面的内容:-

listFiles = glob.iglob('logFile/*.json') 
latestFile = max(listFiles, key=os.path.getctime)
if latestFile newer than previous open/read file: # Not sure to compare the latest file with the previous file.
    with open(latestFile, 'r') as f:
       mydata = json.load(f)
       print(mydata)
else:
    print("no new file created")

感谢您的帮助。示例解决方案很适合分享。


我无法找出解决方案...看起来很简单,但几天尝试 n 错误却没有任何运气。

(1)Make sure read latest file in directory 
(2)Make sure read file/s that may miss to read (due to script fail to run)
(3)Only read once all the files and if no new file give warning.

谢谢。


经过 SO 讨论和建议,我得到了一些解决方法或至少可以满足一些要求。我只是移动已处理的文件。如果没有创建文件,脚本将不会运行,如果脚本失败并且一旦规范化,它将运行并读取所有可用的相关文件。我认为它现在很好。谢谢各位...

【问题讨论】:

  • 这是一个持续运行的脚本吗?如果没有,您可以使用pickle 存储上次读取的文件名并与新文件上的文件名进行比较。在任何情况下,您都必须将最后一个文件的上下文存储在某处。如果您读取的最后一个文件是 file3 但在脚本再次运行之前,还有一个 file4 和一个 file5 会发生什么?
  • 嗨...脚本将每 45 分钟运行一次并获取最新的 json 文件。我忘了告诉每 30 分钟创建一次 json 文件。因此,每 30 分钟应该有一个新文件。我预见到如果新的 json 文件无法创建以及脚本无法运行.. 如果脚本停止运行......并且创建了几个 json 文件(例如 file4 和 file5).. 脚本需要再次检查哪个文件丢失并尝试读取这些文件...或未按上述指定创建的新 json 文件....我只是不确定如何克服可能的问题。
  • 如果您能够创建一个临时缓存文件(即脚本旁边的 json 文件),那么我相信您所能做的就是使用该缓存文件来跟踪 last file processed,即total items in the directory, during that last process 可能还有 timestamp of last process(这个帮助评估使用下一个要处理的文件的日期/时间值)
  • 另一种方法可能是将文件名保存为日期和时间戳。 20200501103000 == 2020-05-01 10:30:00。然后,如果您使用 os.listdir(),它会按顺序出现,即使没有,您也可以对列表进行排序(因为所有内容都将是相同的长度,即使是字符串也会正确排序)。跨度>
  • 另外,如果你使用 os.stat() 会发生什么?

标签: python json file glob


【解决方案1】:

下面是答案,我想提出一种方法:

思路如下:
写入目录的每个日志文件都可以在其中包含一个名为 "creation_time": timestamp 的 key-val(存储在服务器中的 fileX.json)。现在,您的脚本在45min 运行以获取转储到目录的文件。在正常情况下,您必须能够读取文件,最后,当您退出脚本时,您可以将上次读取的文件名和从 fileX.json 获取的 creation_time 存储到 logger.json 中。
logger.json 的示例如下:

{
"creation_time": "03520201330",
"file_name": "file3.json"
}  

每当服务器出现故障或发生任何延迟时,都可能会重写目录中已创建的 fileX.jsonnew fileX's.json。在这些情况下,您将首先打开 logger.json 并获取时间戳和最后一个文件名,如上例所示。通过使用最后一个文件名,您可以将记录器中存在的旧时间戳与fileX.json 中的新时间戳进行比较。如果它们基本上匹配,则没有更改,您只需提前读取文件并重写记录器。
如果不是这种情况,您将重新阅读最后一个 fileX.json 并继续阅读其他前面的文件。

【讨论】:

  • 嗨,coldy...这是个好方法..我可以理解逻辑,它确实包含所有要求。您是否有任何类似的示例代码可以参考...对不起,我不是编码员,我大部分时间都在尝试错误...学习它...无论如何...谢谢您的时间和帮助...我很感激。谢谢
  • 我没有这样的源代码,我只是设计了一种方法,用一点谷歌搜索我认为必须有可能的每个步骤。
  • 谢谢你。是的...我已经搜索并仍然看起来相似...
  • @chenoi 如果对您有帮助,您可以接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多