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')
拆分 lines
的 line
,这样会简单得多。
我有一个 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')
拆分 lines
的 line
,这样会简单得多。