Python 将文本表结构转换为列表

Python 将文本表结构转换为列表,python,Python,有人能告诉我如何转换如下表: Device Type Model Description Vendor -------------------------------------------------------------- Device1 Network1 Model2 Network Device1 bla bla Device2 Network2 Model2

有人能告诉我如何转换如下表:

    Device      Type       Model          Description      Vendor
   --------------------------------------------------------------
    Device1    Network1     Model2       Network Device1     bla bla
    Device2    Network2     Model2       Network Device2     bla bla
Device = [Device1, Device2]
Type = [Network1, Network1]
Model = [Model2, Model2]
Description = [Network Device1 , Network Device2]
Vendor = [bla bla, bla bla]
如下所示:

    Device      Type       Model          Description      Vendor
   --------------------------------------------------------------
    Device1    Network1     Model2       Network Device1     bla bla
    Device2    Network2     Model2       Network Device2     bla bla
Device = [Device1, Device2]
Type = [Network1, Network1]
Model = [Model2, Model2]
Description = [Network Device1 , Network Device2]
Vendor = [bla bla, bla bla]
我尝试使用:

networkdata = open("./bin/data.txt",'r').read()
for row in networkdata:
    row = networkdata.rstrip('\n').split(" ")
    networkdataTable= [r.strip() for r in row if r != '']
但是运气不好,有人能帮我吗?

最新答案: 我将采用@kaya3给出的使用regex的绝妙解决方案,并将其包含在我的答案中

import re
txt = '''\
    Device     Type         Model        Description         Vendor
   --------------------------------------------------------------
    Device1    Network1     Model2       Network Device1     bla bla
    Device2    Network2     Model2       Network Device2     bla bla'''

Device      = []
Type        = []
Model       = []
Description = []
Vendor      = []

for i,t in enumerate(txt.split('\n')):
    if i< 2: continue  #ignore header and the line with ---
    x = re.split(r'\s\s+', t.strip())

    Device.append(x[0].strip())
    Type.append(x[1].strip())
    Model.append(x[2].strip())
    Description.append(x[3].strip())
    Vendor.append(x[4].strip())

print (Device)
print (Type)
print (Model)
print (Description)
print (Vendor)
先前的答复: 您可以遍历字符串并按位置提取数据

d = []
for t in txt.split('\n'):
    y = []
    y.append(t[4:11].strip())
    y.append(t[15:23].strip())
    y.append(t[27:35].strip())
    y.append(t[35:60].strip())
    y.append(t[60:].strip())
    d.append(y)
d.pop(1)
print (d)
其输出将为:

['Device', 'Device1', 'Device2']
['Type', 'Network1', 'Network2']
['Model', 'Model2', 'Model2']
['Description', 'Network Device1', 'Network Device2']
['Vendor', 'bla bla', 'bla bla']
[['Device', 'Type', 'Model', 'Description', 'Vendor'], ['Device1', 'Network1', 'Model2', 'Network Device1', 'bla bla'], ['Device2', 'Network2', 'Model2', 'Network Device2', 'bla bla']]
['Device', 'Device1', 'Device2']
['Type', 'Network1', 'Network2']
['Model', 'Model2', 'Model2']
['Description', 'Network Device1', 'Network Device2']
['Vendor', 'bla bla', 'bla bla']
如果要将它们存储到单独的变量中,可以给出:

Device      = []
Type        = []
Model       = []
Description = []
Vendor      = []

for x in d:
    Device.append(x[0])
    Type.append(x[1])
    Model.append(x[2])
    Description.append(x[3])
    Vendor.append(x[4])


print (Device)
print (Type)
print (Model)
print (Description)
print (Vendor)
其输出将为:

['Device', 'Device1', 'Device2']
['Type', 'Network1', 'Network2']
['Model', 'Model2', 'Model2']
['Description', 'Network Device1', 'Network Device2']
['Vendor', 'bla bla', 'bla bla']
[['Device', 'Type', 'Model', 'Description', 'Vendor'], ['Device1', 'Network1', 'Model2', 'Network Device1', 'bla bla'], ['Device2', 'Network2', 'Model2', 'Network Device2', 'bla bla']]
['Device', 'Device1', 'Device2']
['Type', 'Network1', 'Network2']
['Model', 'Model2', 'Model2']
['Description', 'Network Device1', 'Network Device2']
['Vendor', 'bla bla', 'bla bla']

假设列由多个空格分隔,并且没有“空”单元格,则可以执行以下操作:

重新导入
打开(“./bin/data.txt”)作为f:
行=映射(str.strip,f)
networkdata_table=[re.split(r'\s\s+',row)for row in rows if row][2:]
#切片[2:]删除前两行,即表头
设备、类型、型号、说明、供应商=zip(*networkdata_表)
这两个重要部分是
re.split(r'\s\s+,…)
,它在出现两个或多个空白字符时拆分字符串,以及
zip(*…)
,它将嵌套列表的“行”转换为“列”


请注意,通常应使用
with
块来打开文件,无需指定
'r'
作为打开文件的模式,因为这是默认模式,并且您可以直接迭代文件句柄对象
f
,一次只获得一行。

您能告诉我以下两行之间的空格是否很大:“Device1 Network1 Model2 Network Device1 bla bla”是“\t”还是空格?嗨,它们是空格我试过了。我想strip()会将
网络设备2
分为两项。
strip()
仅从行的开头和结尾删除空格。它不处理单词之间的空格。拆分仅由
re.split
完成,此正则表达式匹配两个或多个空格,而不是单个空格。对不起,我是指split()。我正在测试代码。我尝试了拆分。首先我想感谢您的帮助,其次..我尝试了代码,但出现了以下错误:设备、类型、型号、说明、供应商=zip(*networkdata_table)值错误:没有足够的值来解包(预期为5,得到1)@kaya3很棒的解决方案。您的代码返回正确的数据,但它是以元组的形式,而要求以列表的形式输出。谢谢,这个解决方案与上面的示例一起使用,但是如果这些空格不同会怎么样。这有关系吗?我的意思是,每个单元格之间没有10个空格,而是15个或更少?请参阅我更新的代码在底部。它几乎和@kaya3做的事情一样。我没有使用zip,而是将它们分开存储。更新后的帖子在顶部显示答案