如何防止多个python脚本覆盖同一个文件?

时间:2017-04-18 19:54:06

标签: python json python-2.7 file

我使用多个python脚本来收集数据并将其写入一个单独的json数据文件。

无法组合脚本。

编写过程很快,并且经常发生错误(例如,最后复制的一些字符),这是致命的,特别是因为我使用的是json格式。

如果有其他脚本当前正在尝试写入文件,有没有办法阻止python脚本写入文件? (如果python脚本试图写入文件的数据丢失,那绝对没问题,但重要的是文件语法不会以某种方式“受伤”。)

代码已截断:

这将打开文件并检索数据:

data = json.loads(open("data.json").read())

这会附加一个新词典:

data.append(new_dict)

旧文件被覆盖:

open("data.json","w").write( json.dumps(data) )

信息 data是一个包含词组的列表。

操作系统:洞穴程序在linux服务器上进行。

2 个答案:

答案 0 :(得分:0)

在Windows上,您可以尝试创建该文件,并在发生异常时挽救(因为文件被另一个脚本锁定)。但是在Linux上,你的方法肯定会失败。

相反,我会

  • 每个新词典写一个文件,按进程ID和计数器后缀文件名
  • 消费过程不读取单个文件,而是读取排序的文件(根据修改时间)并从中构建数据

所以在每个剧本中:

filename = "data_{}_{}.json".format(os.getpid(),counter)
counter+=1
open(filename ,"w").write( json.dumps(new_dict) )

并在消费者中(读取受保护循环中已排序文件的每个dict):

files = sorted(glob.glob("*.json"),key=os.path.getmtime())
data = []
for f in files:
   try:
      with open(f) as fh:
          data.append(json.load(fh))
   except Exception:
       # IO error, malformed json file: ignore
       pass

答案 1 :(得分:0)

我会发布自己的解决方案,因为它对我有用:

每个python脚本都会检查(在打开和写入数据文件之前)是否存在名为data_check的文件。如果是这样,pyhthon脚本不会尝试读取和写入文件并解除应该写入文件的数据。如果没有,python脚本会创建文件data_check,然后开始读取文件。写入过程完成后,文件data_check将被删除。