0

我有一个看起来很奇怪的 csv 文件。它有子部分,每个子部分都有 csv 格式的数据。

数据例如:

Device Name: Test-0001

Sub section 1
header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

Sub section 2
header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

.....

Sub section n

header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

Device Name: Test2-0002
and same format afterwards....

我希望将每个“设备名称:”映射到所有子部分,直到下一个“设备名称:”出现

我该怎么做?

4

1 回答 1

0

我会尝试定义一个字典,将您的设备作为键,将行列表作为值。假设这lines是文件行的列表:

with open(your_file_name, "r") as f:
    lines = f.readlines()

devices = {}
key = None
for line in lines:
    if not line.strip():
        continue
    if line.startswith("Device Name"):
        key = get_key(line)
        devices[key] = []
    else:
        devices[key].append(line)

whereget_key是你要定义的函数,它会将一条线Device Name: Test2-0002转换成你想要的东西。

例如,如果你想要你的键Device Name: Test2-0002,你可以定义get_keyget_key = lambda line: line:它是一个函数,当给定 a 时,它line会返回完全相同的结果line而无需任何处理。

如果您希望您的密钥像Test2-0002,您可以编写您的get_key函数来删除Device Name:字符串,或者在':'...之后获取字符串的一部分

这是一个相当基本的解决方案,但如果您不介意一次存储文件的行,它应该可以工作。如果这是一个问题,只需使用 afile.readline()而不是lines列表。

一个稍微高级一点的解决方案可以基于该mmap模块:找到你的Device Name行的位置并存储它们。然后,您可以逐节阅读。

于 2012-08-27T10:42:28.033 回答