2015-06-17 3 views
-1

Мой файл отформатирован в три колонки цифр:Как преобразовать текстовый файл в словарь и распечатать его?

2 12345 1.12345 
1 54321 1.54321 
3 12345 1.12345 

Я хотел бы иметь Python использовать первые два столбца в качестве ключей и использовать третий столбец в качестве значений. Файл большой, что означает, что я не могу отформатировать его вручную. Итак, как мне Python автоматически конвертировать мой большой файл в словарь?

Вот мой код:

with open ('file name.txt' 'r') as f: 
    rows = (line.split('\t') for line in f) 
    d = { row[0]:row[:3] for row in rows} 
    print(d) 

Выходные печатает номера по диагонали повсюду. Как правильно отформатировать его?

+0

Это выглядит как первая линия образца создаст ключ ' "2" 'и значение '['2', '12345', '1.12345']'. Это то, что вы намерены? Что касается печати, отправка словаря в стандартную функцию 'print()' не автоматически форматирует его, поэтому вам придется решить, как вы хотите его распечатать, а затем реализовать. – TigerhawkT3

+1

Можете ли вы дать образец желаемого результата? –

+0

[pprint] (https://docs.python.org/3/library/pprint.html) может помочь некоторым форматам. –

ответ

0

Вы должны попробовать -

import pprint 
d = {} 
with open ('file name.txt','r') as f: 
    for line in f: 
     row = line.split('\t') 
     if len(row) == 3: 
      d[(row[0], row[1])] = row[2] 
pp = pprint.PrettyPrinter(indent=4) 
pp.pprint(d) 
+1

Это не будет печатать словарь более аккуратно, чем то, что имеет OP (и я не уверен, что это структура словаря, которую они хотят). – TigerhawkT3

+0

Правда, но он фиксирует логические проблемы, которые OP имел в своем коде, по крайней мере, согласно его требованиям. –

+0

Я думаю, что использование pprint - это ответ на его вопрос. Это форматирует словарь и корректно выводит его ** на экран. –

0

Banana, вы близки.

  1. Вам нужна запятая, разделяющая аргументы open.
  2. Вы хотите назначить третий элемент row, то есть row[2].
  3. Вам нужно решить, как сгруппировать первые два члена строки в хешируемый ключ. Изготовление кортежа из них, т. Е. (row[0],row[1]) работает.
  4. Печать словаря по строкам.

Try:

with open('filename.txt','r') as f: 
    rows = (line.split('\t') for line in f) 
    d = { (row[0],row[1]):row[2] for row in rows} 
for key in d.keys(): 
    print key,d[key]  
+0

Я подозреваю, что проблема 1 была ошибкой копирования-вставки, поскольку, если бы у них было это так в своей программе, я думаю, что они получат трассировку, говорящую, что '' filename.txtr' не существует. – TigerhawkT3

+0

Этот подход, кстати, включает символ новой строки '\ n' в качестве конечного символа каждого значения словаря. Чтобы избежать этого, используйте 'strip()', либо в 'rows = (line.strip(). Split ('\ t') для строки в f)' или 'd = {(строка [0], строка [1] ]): row [2] .strip() для строки в строках} '. Хорошее понимание слова. – rjonnal

+0

Можете ли вы объяснить, почему я продолжаю получать ошибку «IndexError: индекс индекса вне диапазона?» Это связано с моим файлом. Если да, то что не так? @rjonnal –

0

Прежде всего, ваш нарезка wrong.You может получить первый столбец буксировочный с line[:2] и 3 с line[2].

Также вам не нужно создавать строки в отделенной структуре данных вы можете использовать распаковку операцию и map функцию в dict comprehension:

with open ('ex.txt') as f: 
     d={tuple(i):j.strip() for *i,j in map(lambda line:line.split('\t'),f)} 

print(d) 

результат:

{('2', '12345'): '1.12345', ('3', '12345'): '1.12345', ('1', '54321'): '1.54321'} 

Обратите внимание, что, как *i - это список, а списки - не подлежащие удалению объекты, которые вы не можете использовать в качестве ключа словаря, чтобы преобразовать его в tuple.

И если вы хотите, чтобы сохранить заказ вы можете использовать collections.OrderedDict:

from collections import OrderedDict 
with open ('ex.txt') as f: 
     d=OrderedDict({tuple(i):j.strip() for *i,j in map(lambda line:line.split('\t'),f)}) 

print(d) 
OrderedDict([(('2', '12345'), '1.12345'), (('1', '54321'), '1.54321'), (('3', '12345'), '1.12345')]) 
+0

Вы можете мне помочь? Ваш выход - это мой желаемый результат. Но можете ли вы подробнее рассказать о своем объяснении? –

+0

@ Banana0101 Какая часть неоднозначна? – Kasramvd

+0

Я вставил части вашего примера выше и получил знаки препинания в выходе @Kasra –

0

Я не уверен, как именно вы хотите ключи макета. Независимо от того, вы должны использовать модуль csv, используя '\t' в качестве разделителя.

import csv 

with open('data.txt') as file: 
    tsvfile = csv.reader(file, delimiter='\t') 
    d = { "{},{}".format(row[0], row[1]): row[2] for row in tsvfile } 
    print(d) 

Распечатывает: { '3,12345': '1,12345', '1,54321': '1,54321', '2,12345': «1.12345' }

С другой стороны, у вас есть это:

with open('data.txt') as file: 
    tsvfile = csv.reader(file, delimiter='\t') 
    d = {} 
    for row in tsvfile: 
     d[row[0]] = row[2] 
     d[row[1]] = row[2] 
    print(d) 

Печатает:

{'54321': '1.54321', '3': '1.12345', '1': '1.54321', '12345': '1.12345', '2': '1.12345'} 
Смежные вопросы