【问题标题】:Repeating fields format in PythonPython中的重复字段格式
【发布时间】:2022-01-12 12:00:22
【问题描述】:

我正在将自定义仪器二进制数据转换为 CSV 文件。 有 100 多个带有浮点、整数和文本的字段。 我正在使用 bitstruct。

    with open('instrument.dat','rb') as f:
        with open('instrument.csv','w') as w:
           header_format = 'u32u8u32t8192'
           header_size = calcsize_in_bytes(header_format)
           body_format = 'u4u4u1u1u1u1u4u16t96f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f3232f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32<'
           body_size = calcsize_in_bytes(body_format)

           ver,instrument,date,comment = unpack(header_format, f.read(header_size))
           w.write('{},{},{},{}\n'.format(ver,instrument,date,comment))
           while True:
               field1,...,fieldn = unpack(body_format,f.read(body_size))

我的问题是如何在 CSV 中编写正文部分? 我不想写一些麻烦的东西,比如:

w.write("{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}...{}\n".format(field1, field2,field3,field4,field5,field6,field7,fiel8,...,fieldN))

有什么简短而聪明的方法吗?

提前致谢。

更多细节:

二进制中有 100 多个具有不同值的字段。 格式是这样的:

u4u4u1u1u1u1u4u16t96f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f3232f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32<

u 是无符号 intffloatstext 都是位

我想要的只是逗号分隔的值,这样我就可以将它们导入到不同的程序中。

Header1,Header2,Header3,…,Header100
Value1,value2,value3,…,value100
...
Value1,value2,value3,...,value100

【问题讨论】:

  • 快速回答:brackets = "{}" * len(variables); fields = brackets.format(*variables)
  • 那个成功了!无论如何要缩短字段?也许将它们放在一个数组中并循环遍历?但是不确定如何将其解压缩到数组中。
  • 如果你举一些关于给定输入和预期输出的例子,也许我会更有帮助。
  • 把更多细节放在帖子里,希望对你有帮助
  • 太棒了!它确实奏效了!我是 python 新手。谢谢!

标签: python string binary format repeat


【解决方案1】:

最终解决方案,基于上述 cmets。

    with open('instrument.dat','rb') as f:
        with open('instrument.csv','w') as w:
           header_format = 'u32u8u32t8192'
           header_size = calcsize_in_bytes(header_format)
           body_format = 'u4u4u1u1u1u1u4u16t96f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f3232f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32<'
           body_size = calcsize_in_bytes(body_format)

           ver,instrument,date,comment = unpack(header_format, f.read(header_size))
           w.write('{},{},{},{}\n'.format(ver,instrument,date,comment))
           while True:
               variables = unpack(body_format,f.read(body_size))
               brackets = "{}," * len(variables)
               brackets = brackes.rstrip(',') + "\n"
               w.write(brakets.format(*variables))

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2023-03-10
    相关资源
    最近更新 更多