Python - 从文本文件中读取并合并信息

时间:2016-02-24 09:07:39

标签: python-3.x enumerate readlines startswith

我在文本文件中有数据,我没有读取问题,但需要删除重复的名称并将值串在一起。见下文:

boris:1
boris:3
boris:8
tim:4
tim:5
tim:2
ella:3
ella:9
ella:6

我需要删除重复的名称并将值添加到一行,如下所示:

boris:1:3:8
tim:4:5:2
ella:3:9:6

到目前为止我尝试过的所有内容都显示所有带有重复名称的值或仅显示最后一个条目。已尝试的方法如下:

file = open ("text1.txt", 'r')
for line in file:
values = line.strip().split(":")
name = values[0]
print(values[0], values[1]) #for checking to see values held
    for index, item in enumerate(line):
        for num in range(3):
            val = {}
            if index ==0:
                name = item
            if index == 1:
                scr1 = item
            val[str(num)] = name + str(scr1)
        print(num)
print(name, scr1)

我也尝试过:

for line in file.readlines():
line = line.split(":")
#print(line)
for n, item in enumerate(line):
    #print(n, line1)
    if n == 0:
        name = item
        #print(name)
        if item.startswith(name):
            line[n] = item.rstrip() # i'm sure that here is where i'm going wrong but don't know how to solve
        #else:
            #line[n] = item.rstrip()
print(":".join(line))
#print(line)

虽然这些工作在某种程度上我无法得到我正在寻找的答案 - 非常感谢任何帮助。 结果最终看起来像:

boris:1
boris:3
boris:8
tim:4
tim:5
tim:2
ella:3
ella:9
ella:6

这是我开始的地方。

2 个答案:

答案 0 :(得分:2)

您需要将整个数据集存储在内存中(实际上,如果您拥有非常大的数据集,可以避免使用它,但实现起来会更困难)。 您需要创建一个dict来存储值。当您遇到新名称时,您将创建新的dict项目,当您遇到现有名称时,您将其值附加到相应的dict项目。

以下是一个示例代码:

dataset = dict()
# first, if we use `with` then file will be closed automatically
with open('text1.txt', 'r') as f:
    # when we want to just iterate over file lines, we can omit `readlines` and use this simple syntax
    for line in f:
        # strip() is important, because each line we read ends with '\n' character - and we want to strip it off.
        # partition() returns tuple of left-part, separator and right-part,
        # but we don't need that separator value so we assign it to a dummy variable.
        # rpartition() is better choice if name may contain ':' character in it.
        name, _, value = line.strip().rpartition(':')
        if name not in dataset:  # newly encountered name?
            # here we create a new `list` holding our value
            dataset[name] = [value]
        else:
            # append the value to existing list
            dataset[name].append(value)

# now print out resulting data
for name, values in dataset.items():
    print(':'.join([name] + values))

如果您需要保留原始名称,请从dict模块中将OrderedDict替换为collections

对最后一部分内容的一些解释: 我们迭代对(name, values)。然后,对于每一对,我们创建一个仅包含name的列表,将该列表与values列表连接起来,然后使用:作为分隔符连接结果列表,并将其打印出来。

答案 1 :(得分:0)

您需要一个临时数据结构,在迭代文件时填充,然后打印。

names = {}
with open("text1.txt", 'r') as file:
    for line in file:
        name, value = line.split(":")
        if name not in names:
            names[name] = []
        names[name].append(value.rstrip())
for name, values in names.items():
    print(name + ":" + ":".join(values))

编辑:太慢了:D