在Python中用多个单词分割行

时间:2019-10-16 03:18:05

标签: python text-files text-processing

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

3 个答案:

答案 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}}拆分出来。