Python 中包含多个单词的拆分行

Split lines with multiple words in Python

我有一个 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的新手,我不知道这样的事情是否可能。任何帮助将不胜感激。谢谢!

您可以使用 ==== 分隔符,因为您可以在所有行中获取与代表一列的每个 ==== 的开始和结束索引相对应的切片:

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() 来获取字符串中字符的索引(我在上面使用它来获取字符串中 = 或 space 的索引分割线)。

列具有固定宽度,因此您可以使用它并分割行

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])

更复杂的解决方案将使用第二行 - === - 计算列的宽度并在切片中使用它们。

正如其他人所建议的,您可以使用每个分隔线的长度来计算 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.split('\t') 拆分 linesline,这样会简单得多。