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,而是将它们分开存储。更新后的帖子在顶部显示答案