【问题标题】:Split binary data from a separator从分隔符拆分二进制数据
【发布时间】:2020-12-16 04:54:17
【问题描述】:

我正在尝试像这样拆分二进制数据字符串:

trama = b'1 ; 12.0073 ; NAN ; NAN\r\n919.537 ; 1082.14 ; 0\r\n0 ; 850.26 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n1 ; 11.9612 ; NAN ; NAN\r\n933.792 ; 1097.16 ; 0\r\n0 ; 846.597 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n'

我想要的是找到# 分隔符,因为这意味着此时一组数据结束,因此以下是另一个不同的示例。

我想要这个:

[
  ['1', '12.0073', 'NAN', 'NAN', '919.537', '1082.14', '0', '0', '850.26', 'NAN', '0', '0', '0', '0', '0'],
  ['1', '11.9612', 'NAN', 'NAN', '933.792', '1097.16', '0', '0', '846.597', 'NAN', '0', '0', '0', '0', '0']
]

现在我正在做所有这些过程:

trama = b'1 ; 12.0073 ; NAN ; NAN\r\n919.537 ; 1082.14 ; 0\r\n0 ; 850.26 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n1 ; 11.9612 ; NAN ; NAN\r\n933.792 ; 1097.16 ; 0\r\n0 ; 846.597 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n'

values = [
    i.strip().decode() for i in trama.split()
    if i.strip().decode() not in [";"]
]


a, b = [], []
for i in values:
  if i != '#':
    b.append(i)
  else:
    a.append(b)
    b = []

它有效,但我确信存在一种更简单的方法来做同样的事情。有人知道实现它的pythonic方法吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    先拆分#。

    trama = b'1 ; 12.0073 ; NAN ; NAN\r\n919.537 ; 1082.14 ; 0\r\n0 ; 850.26 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n1 ; 11.9612 ; NAN ; NAN\r\n933.792 ; 1097.16 ; 0\r\n0 ; 846.597 ; NAN\r\n0 ; 0 ; 0\r\n0 ; 0 ; #\r\n'
    
    lines = trama.decode('UTF-8').split('#')
    
    records = []
    
    for line in lines:
        if not line.strip(): continue
        records.append([v.strip() for v in line.replace('\r\n', ';').split(';') if v.strip()])
    
    for values in records:
        print(values)
    

    【讨论】:

    • 谢谢,但我不能使用re
    • 编辑删除re。
    【解决方案2】:

    @Lleims 你的问题不够详细,不过我还是会帮你的。

    我看到了 4 个不同的分隔符:

    • '#':记录分隔符
    • '\r\n' : 行分隔符(无用)
    • ';' : 项目分隔符
    • ' ' : 间隔(无用)

    我会假设 trama 以 '#\r\n' 或 '#' 或 '\r\n' 结尾,但没有别的。
    我还假设项目字符串中没有空格、“#”或“\r\n”。

    代码如下:

        trama = b'...'    
        s = trama.decode().replace( '\r\n', '').replace( ';', '').rstrip( '#')    
        records = []    
        recs = s.split( '#') # get a list of records    
        for rec in recs: records.append( rec.split()) # get a list of lists
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-27
      • 2018-10-25
      • 2021-05-01
      • 2013-09-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多