【问题标题】:Replace numbers in YAML file with random numbers用随机数替换 YAML 文件中的数字
【发布时间】:2022-07-25 13:02:05
【问题描述】:

我有一个包含很多数字的文件。我希望每个数字都将替换为一个随机数。以便 Python 脚本更改 YAML 文件。如何用 Python 编写代码?

!h 1: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}
!h 2: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}
!h 3: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}
!h 4: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}
!h 5: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}
!h 6: {X: '-950,00000', Y: '1500,00000', Z: '150,00000'}

【问题讨论】:

  • 该文件是 YAML 文件(带有标签)而不是 XML 文件。
  • 谢谢你,这对我帮助很大!但我有一个问题。我已经安装了每个组件。我收到此错误。 :第 53 行,在 for v in data.values(): AttributeError: 'CommentedSeq' object has no attribute 'values'

标签: python python-3.x random yaml


【解决方案1】:

您可以使用ruamel.yaml 做到这一点。生成随机数的方法有很多种,因为您需要将它们作为标量字符串并以逗号作为小数分隔符,我建议使用random.randrange 并将结果作为字符串进行处理:

import sys
from random import randrange
from pathlib import Path
import ruamel.yaml

in_file = Path('input.yaml')
out_file = Path('output.yaml')

def randfloatstr():
    # this gives you max 4 digits before the comma and 5 digits after
    x = str(randrange(0, 1000000000))
    return x[:-5] + ',' + x[-5:]
    
yaml = ruamel.yaml.YAML()
data = yaml.load(in_file)
for v in data.values():
    for k in v:
        v[k] = randfloatstr()

yaml.dump(data, out_file)
sys.stdout.write(out_file.read_text())

给出:

!h 1: {X: '2767,85747', Y: '8281,59187', Z: '2729,91875'}
!h 2: {X: '324,84623', Y: '6669,00402', Z: '6183,89608'}
!h 3: {X: '5349,15868', Y: '7987,69554', Z: '243,05155'}
!h 4: {X: '6738,35201', Y: '2497,61750', Z: '2933,25689'}
!h 5: {X: '6013,68067', Y: '5265,31446', Z: '9229,21356'}
!h 6: {X: '4656,47702', Y: '4710,97938', Z: '5264,45726'}

ruamel.yaml 将保留标签 (!h),但不能为较小的数字对齐列。

【讨论】:

  • 谢谢,这对我很有帮助!但我收到了这个错误。我已经安装了所有组件。 File "randomizer.py", line 53, in <module> for v in data.values(): AttributeError: 'CommentedSeq' object has no attribute 'values'
  • “which give:”后面的部分是根据您看到的代码和包含您的示例 YAML 的文件完全生成的。您确定您的输入文件与您的问题完全一样吗?它是否有一些[`` or -] at the start? I suspect that because your error indicates you loaded a sequence into data. In that case you need to do something like for v in data[0].values():`.
  • 你也可以在加载后直接print(data),看看你加载了什么数据结构。
  • 好的,它正在正确加载文件,但我收到此错误。我编辑了 data[0].values() 行。我收到此错误:for k in v: TypeError: 'int' object is not iterable
  • @Anthon:“如果可行,请接受答案。” - 在 Stack Overflow 上,我们不鼓励强迫任何人接受答案。如果您怀疑 Stack Overflow 上的新提问者并且不知道“接受”是什么意思,那么您可以礼貌地描述一下。在其他情况下,没有理由提醒您接受答案。
猜你喜欢
  • 2015-06-02
  • 2012-06-24
  • 2020-08-14
  • 2017-05-20
  • 2017-03-06
  • 1970-01-01
  • 2018-12-08
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多