我从SQL查询中得到了一个(非常难看的)txt输出,该输出由我无法更改的外部系统执行。这是输出示例:
FruitName Owner OwnerPhone
============= ================= ============
Red Apple Sr Lorem Ipsum 123123
Yellow Banana Ms Dolor sir Amet 456456
如您所见,FruitName
列和Owner
列可能包含几个单词,这些列中可以包含多少个单词没有固定的模式。如果我使用line.split()
在Python的每一行上创建数组,它将删除所有空白,并使数组变成这样:
['Red', 'Apple', 'Sr', 'Lorem', 'Ipsum', '123123']
['Yellow', 'Banana', 'Ms', 'Dolor', 'sir', 'Amet', '456456']
问题是,如何将它正确地分成这样的输出:
['Red Apple', 'Sr Lorem Ipsum', '123123']
['Yellow Banana', 'Ms Dolor sir Amet', '456456']
我是Python的新手,我不知道这种事情是否可行。任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
您可以使用====
分隔符来获得优势,因为您可以在与代表列的每个====
的开始和结束索引相对应的所有行中获取切片:
def get_divider_indices(line):
i, j = 0, line.index(' ')
indices = []
while i != -1:
indices.append((i, j))
i = line.find('=', j)
j = line.find(' ', i)
if j == -1: j = len(line)
return indices
with open('data.txt', 'r') as f:
lines = f.readlines()
dividers = get_divider_indices(lines[1])
rows= []
for line in lines[2:]:
rows.append([line[s:e].strip() for s, e in dividers])
print(rows)
输出
[['Red Apple', 'Sr Lorem Ipsum', '123123'], ['Yellow Banana', 'Ms Dolor sir Amet', '456456']]
请注意,您可以使用str.find()
来获取字符串中字符的索引(我在上面使用它来获取=
的索引或分隔线中的空格)。
答案 1 :(得分:1)
列的宽度固定,因此您可以使用它和切片线
data = '''FruitName Owner OwnerPhone
============= ================= ============
Red Apple Sr Lorem Ipsum 123123
Yellow Banana Ms Dolor sir Amet 456456'''
lines = data.split('\n')
for line in lines[2:]:
fruit = line[:13].strip()
owner = line[13:32].strip()
phone = line[32:].strip()
print([fruit, owner, phone])
更复杂的解决方案将使用第二行-===
-计算列的宽度并将其用于切片。
答案 2 :(得分:1)
如其他人所建议,您可以使用每个分隔符的长度来计算columns
的长度。以下示例说明了这一点:
rows = list()
with open('data.txt', 'r') as f:
lines = f.readlines()
dividers = lines[1].split()
for line in lines[2:]:
row = []
prvLength = 0
for d in dividers:
start = prvLength
length = start+len(d)+1
row.append(line[start:start+length].strip())
prvLength += length
rows.append(row)
print(rows)
输出
[['Red Apple', 'Sr Lorem Ipsum', '123123'], ['Yellow Banana', 'Ms Dolor sir Amet', '456456']]
TABS
,即'\t'
隔开。如果是这样,您可以使用line
仅将lines
的{{1}}拆分出来。