Python中的单独行

时间:2017-11-12 21:07:42

标签: python list file

我有一个.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()]

3 个答案:

答案 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)