我有一个.txt文件。它有3个不同的列。第一个是数字。第二个是以0开头的数字,直到7.最后一个是一个句子。我希望将它们保存在不同的列表中,因为它们与数字匹配。我想写一个函数。如何在不中断的情况下将它们分隔在不同的列表中?
.txt:
的例子1234 0 my name is
6789 2 I am coming
2346 1 are you new?
1234 2 Who are you?
1234 1 how's going on?
我保持这样:
----1----
1234 0 my name is
1234 1 how's going on?
1234 2 Who are you?
----2----
2346 1 are you new?
----3-----
6789 2 I am coming
到目前为止我尝试过:
inputfile=open('input.txt','r').read()
m_id=[]
p_id=[]
packet_mes=[]
input_file=inputfile.split(" ")
print(input_file)
input_file=line.split()
m_id=[int(x) for x in input_file if x.isdigit()]
p_id=[x for x in input_file if not x.isdigit()]
答案 0 :(得分:2)
使用您当前的方法,您将整个文件作为字符串读取,并在空格上执行拆分(而不是在换行符上拆分,因为每行都用换行符分隔)。此外,您还没有正确地将数据分成不同的列。
你有3列。您可以使用str.split(None, 2)
将每一行拆分为3个部分。 None
意味着分裂空间。每个组将作为键列表对存储在字典中。在这里我使用OrderedDict
以防您需要维护顺序,但您可以像使用相同分组(但没有订单!)那样轻松地将o = {}
声明为普通字典。
from collections import OrderedDict
o = OrderedDict()
with open('input.txt', 'r') as f:
for line in f:
i, j, k = line.strip().split(None, 2)
o.setdefault(i, []).append([int(i), int(j), k])
print(dict(o))
{'1234': [[1234, 0, 'my name is'],
[1234, 2, 'Who are you?'],
[1234, 1, "how's going on?"]],
'6789': [[6789, 2, 'I am coming']],
'2346': [[2346, 1, 'are you new?']]}
在处理文件I / O时始终使用with...as
上下文管理器 - 它可以实现干净的代码。另请注意,对于较大的文件,迭代每一行会更有效。
答案 1 :(得分:1)
也许你想要这样的东西:
import re
# Collect data from inpu file
h = {}
with open('input.txt', 'r') as f:
for line in f:
res = re.match("^(\d+)\s+(\d+)\s+(.*)$", line)
if res:
if not res.group(1) in h:
h[res.group(1)] = []
h[res.group(1)].append((res.group(2), res.group(3)))
# Output result
for i, x in enumerate(sorted(h.keys())):
print("-------- %s -----------" % (i+1))
for y in sorted(h[x]):
print("%s %s %s" % (x, y[0], y[1]))
结果如下(如果您愿意,可添加更多换行符):
-------- 1 -----------
1234 0 my name is
1234 1 how's going on?
1234 2 Who are you?
-------- 2 -----------
2346 1 are you new?
-------- 3 -----------
6789 2 I am coming
它基于正则表达式(python中的模块re)。当您想要匹配基于简单线条的模式时,这是一个很好的工具。
这里它依赖于空格作为列分隔符,但它可以很容易地适应固定宽度的列。
结果收集在列表字典中。每个列表包含位置和文本的元组(对)。
程序等待输出以排序项目。
答案 2 :(得分:0)
这是一个非常难看的代码,但它很容易理解。
raw = []
with open("input.txt", "r") as file:
for x in file:
raw.append(x.strip().split(None, 2))
raw = sorted(raw)
title = raw[0][0]
refined = []
cluster = []
for x in raw:
if x[0] == title:
cluster.append(x)
else:
refined.append(cluster)
cluster = []
title = x[0]
cluster.append(x)
refined.append(cluster)
for number, group in enumerate(refined):
print("-"*10+str(number)+"-"*10)
for line in group:
print(*line)