2016-02-24 4 views
1

У меня есть данные в текстовом файле, который у меня нет проблем с чтением, но вам нужно удалить повторяющиеся имена и связать значения вместе. Смотрите ниже:Python - Чтение из текстового файла и информация об объединении

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

Вам нужно будет хранить весь набор данных в памяти (на самом деле, его можно избежать, если требуется очень большой набор данных, но его будет сложнее реализовать). Вам необходимо создать 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, затем объединяем результирующий список, используя : в качестве разделителя и распечатываем его.

+0

Спасибо так много - это одна была сводит меня с ума - это работает на месте. :) – VTX

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

Edit: Слишком медленно: D

+1

Использование 'split', вероятно, не самый лучший вариант: если у нас не будет': 'в строке, тогда' split' вернет список из 1 элемента, и мы потерпим неудачу с 'ValueError' (слишком много значений для распаковать). То же самое произойдет, если у нас слишком много ':' -s. С другой стороны, 'partition' будет возвращать пустые строки для частей, которые он не смог найти. – MarSoft

+0

Huh TIL. Я оставлю это здесь, чтобы другие могли видеть. – fafl

+0

Блестящий - спасибо, что он сделал именно то, что мне нужно. – VTX