【问题标题】:How to prevent multi python scripts to overwrite same file?如何防止多个python脚本覆盖同一个文件?
【发布时间】:2017-09-14 19:36:13
【问题描述】:

我使用多个 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服务器上。

【问题讨论】:

  • 这是一个与系统相关的问题。在 Windows 本地驱动器上,文件在写入时被锁定,因此您不能进行并发写入。在 linux 上,您可以进行并发写入。
  • 如果你写在不同的文件上,你会如何组合结果?最后一个赢了?
  • @Jean-FrançoisFabre 一切都发生在 linux 服务器上
  • @Jean-FrançoisFabre 是的,没有合并,最后/或第一个获胜
  • 您可以将数据写入不同的文件(以进程ID为后缀)并最终将它们组合在一起,但是如果顺序很重要,则必须按文件日期对它们进行排序(这也是可能的)

标签: python json python-2.7 file


【解决方案1】:

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

相反,我会

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

所以在每个脚本中:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2015-04-09
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多