0

如何读取包含一行(10 csv 字符串)数字和文本的文件,然后在此行之后,有 4096 个字节?

像这样的东西:

  117,47966,55,115,223,224,94,0,28,OK: 
  \00\00\00\F6\FF\EF\FFF\00\FA\FF\00\CA\FF\009\00Z\00\D9\FFF\00\E3\FF?\00\F0\FF\00\B1\FF\9D\FF\00:\00b\00\E9\FF*\00:\00\00)\00\D3\FF,\00\C6\FF\D6\FF2\00\00!\00\00\00\FE\FF\BA\FF[\00\E8\FF.\00\F7\FF\F9\FF\E6\FF\00\D3\FF\F8\FF\00&\00\

过去,我一直使用 ConstBitStream 来读取纯二进制文件。我想知道如何逐行读取,每次找到“OK:”时,使用 ConstBitStream 读取以下 4096 个字节?

with open(filename, encoding="latin-1") as f:
        lines = f.readlines()
        for i in range(1,len(lines)):
            elements = lines[i].strip().split(',')
            if(len(elements)==10):
                readNext4096bytes()
4

2 回答 2

0

让我知道这个是否奏效:

import pandas as pd
from bitstring import ConstBitStream

# Read csv using pandas
df = pd.read_csv(filename, error_bad_lines=False, encoding='latin1')

# Take the last column (10) and cast every value to ConstBitStream
df.iloc[:, 9].apply(ConstBitStream)
于 2019-08-20T08:52:29.433 回答
0

说你的文件是这样的

    1,2,3,好的:
    4096 字节
    5,6,7,好的:
    4096 字节
    ...
  1. 以二进制模式读取文件:file = open(file_name, 'rb').read()
  2. split:data = file.split(b',OK:\n')
    data是一个列表:[b'1,2,3', b'4096bytes\n4,5,6', b'4096bytes\n7,8,9', ..., b'4096bytes']
  3. 对于一个典型的元素,bitarray, record = element[:4096], element[4096+1:]
    你当然必须对第一个和最后一个元素进行特殊处理......

PS如果您的文件由一个记录和一个位数组组成,那么data很简单
[b'1,2,3', b'4096bytes']

PPS 如果您的二进制字符串包含b',OK:\n'上述方法失败但是 - 5 个字节的可能组合是256**5,4096 个字节中 5 个字节序列的数量是4096+1-5,因此这种不幸可能性的概率是 4092/256**5 → 3.7216523196548223e-09 * 在单个二进制记录中 * - 如果你有一些记录可能还可以,如果您有几百万条记录,那么您需要大量内存,但错误的可能性不再可以忽略不计。

于 2019-08-20T09:14:19.070 回答