2017-04-18 163 views
0

我使用多个Python脚本收集数据并将其写入一个单一的json数据文件。如何防止多python脚本覆盖相同的文件?

不可能组合脚本。

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

如果有其他脚本正在尝试写入文件,是否有办法阻止python脚本写入文件? (这将是绝对OK,如果是,python脚本尝试写入到文件中的数据丢失,但该文件的语法不会被莫名其妙地“受伤”是很重要的。)

代码剪断:

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

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

这追加一个新的字典:

data.append(new_dict)

而旧文件被覆盖:

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

信息:data是包含类型的字典列表。

操作系统:漏洞进程发生在Linux服务器上。

+0

这是一个系统相关的问题。在Windows本地驱动器上,写入时文件被锁定,因此不能并发写入。在Linux上,你可以并发写入。 –

+0

如果你写了不同的文件,你会如何结合结果?最后一个胜利? –

+0

@ Jean-FrançoisFabre一切都发生在一个linux服务器上 –

回答

0

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

相反,我会

  • 写入每个新的字典一个文件,后面添加了进程的ID文件名和反
  • 耗时的过程(ES),不读一个单一的文件,但排序的文件(根据修改时间)和因此,在每个脚本从它

构建数据:

filename = "data_{}_{}.json".format(os.getpid(),counter) 
counter+=1 
open(filename ,"w").write(json.dumps(new_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 
0

我将发布自己的解决方案,因为它为我工作:

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