2016-02-24 3 views
2
dic = {'S00:D58': 1, 'M23:Q14': 1, 'S43:H52': 84, 
    'S43:H53': 2, 'S43:H50': 5, 'S43:H57': 1, 'M87:E11': 10} 

и я сделалкак написать таблицу словаря в текстовый файл?

for k,v in dic.items():  
    a,b = k.split(':')  
    print a.ljust(30), b.ljust(30), v  

, чтобы получить это,

S00   D58   1  
M23   Q14   1 
S43   H52   84 
S43   H53   2 
S43   H50   5 
S43   H57   1 
M87   E11   10 

Я хотел сохранить эту таблицу в табуляцией текстовый файл. поэтому я попытался

data = a.ljust(30), b.ljust(30), v  
f.write(str(data))  
f.close() 

, но я получил

('S00', 'D58', 1)('M23', 'Q14', 1)('S43', 'H52', 84)('S43', 'H53', 2)('S43', 'H50', 5)('S43', 'H57', 1)('M87', 'E11', 10) 

вместо разделителями табуляцией таблицы, что я хотел?

Как я могу получить вывод моего файла в соответствии с тем, что я напечатал?

ответ

0

, когда вы делаете что-то вроде:

data = 1,2,3 
#or 
data = a.ljust(30), b.ljust(30), v 

информация заканчивается упаковывается в кортеж, распаковать его в той же манере, что print заявление делает в Python 2 вы можете сделать:

f.write(" ".join(data) + "\n") 

Это делает строку каждого элемента данных разделенной пробелом, за которым следует символ новой строки. (В основном то, что print делает автоматически)

Существует также синтаксис, который print имеет который позволяет печатать материал в другой файл, например так:

print >>f, a.ljust(30), b.ljust(30), v 

Избавления от этого запутанного синтаксиса и предотвращая точную проблему, с которой встречаются некоторые из причин print был преобразован в функцию в Python 3, новый синтаксис выглядит так:

data = a.ljust(30), b.ljust(30), v 
print(*data, file=f) 
#or 
print(a.ljust(30), b.ljust(30), v, file=f) 

Если вы предпочли бы использовать эти обозначения для печати stateme nts без изменения версий вы можете добавить это как первую строку файла:

from __future__ import print_function 
-1

Используй панду

import pandas as pd 

dic = {'S00:D58': 1, 'M23:Q14': 1, 'S43:H52': 84, 'S43:H53': 2, 'S43:H50': 5, 'S43:H57': 1, 'M87:E11': 10} 

df = pd.Dataframe(dic) 
df.to_csv('test.tsv', '\t', index=False) 
+0

Ответ на этот вопрос неверен. Правильный способ импорта словаря в DataFrame - это 'df = pd.DataFrame.from_dict (dic, orient = 'index')'. И затем он может быть перенесен в файл с помощью 'df.to_csv ('test.tsv', '\ t', header = False, index = True)' –

0

Вместо создания списка ватных строк, просто создать одну проложенную строку.

with open('/path/to/dest/file', 'w') as dest: 
    for k, v in dic.items(): 
     a, b = k.split(':') 
     data = '{a}{b}{v}'.format(a=a.ljust(30), b=b.ljust(30), v=v) 
     data = '{:<30}{:<30}{}'.fomat(a, b, v) 
     print data 
     dest.write('%s\n' % data) 
+2

вы можете вместо этого использовать 'data = '{a: <30 } {b: <30} {v} '. fomat (a = a, b = b, v = v) 'или даже лучше' data =' {: <30} {: <30} {} '. fomat (a, b, v) 'https://docs.python.org/2/library/string.html#formatspec –

0

В стандартной библиотеке есть библиотека csv, которая полезна для этого. Вы можете использовать встроенный диалект "excel-tab" для вывода данных с разделителями таблеток вместо данных с разделителями-запятыми.

import csv 

dic = {'S00:D58': 1, 'M23:Q14': 1, 'S43:H52': 84, 
    'S43:H53': 2, 'S43:H50': 5, 'S43:H57': 1, 'M87:E11': 10} 

with open("output.tsv", "w") as csvfile: 
    writer = csv.writer(csvfile, dialect="excel-tab") 
    for key, value in dic.items(): 
     a, b = key.split(":", 1) 
     writer.writerow((a, b, value)) 
0

Это путь Панды. Словарь преобразуется в DataFrame со столбцами «key'and val», содержащими ключи и значения словаря. Затем создается вторая фреймворк данных путем разделения столбцов «ключ» в двух столбцах, соответствующих разделителю строк: «.Наконец, два блока данных объединяются и экспортируются в файл TSV:

dic = {'S00:D58': 1, 'M23:Q14': 1, 'S43:H52': 84, 'S43:H53': 2, 'S43:H50': 5, 'S43:H57': 1, 'M87:E11': 10} 

originalDF = pd.DataFrame(dic.items()).rename(columns={0: 'key', 1:'val'}) 
split_keysDF = pd.DataFrame(originalDF['key'].str.split(':').tolist()) 
finalDF = split_keysDF.join(originalDF['val']) 

finalDF.to_csv('test.tsv', '\t', header=False, index=False) 
Смежные вопросы