【发布时间】: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() 会发生什么?