Python создает словарь и переводит их в другой файл - PullRequest
3 голосов
/ 01 апреля 2010

У меня есть два файла с разделителями табуляции .csv. Из one.csv я создал словарь, который выглядит следующим образом:

'EB2430': ' "\t"idnD "\t"yjgV "\t"b4267 "\n',
'EB3128': ' "\t"yagE "\t\t"b0268 "\n',
'EB3945': ' "\t"maeB "\t"ypfF "\t"b2463 "\n',
'EB3944': ' "\t"eutS "\t"ypfE "\t"b2462 "\n',

Я хотел бы вставить значение словаря в файл second.csv, который выглядит следующим образом:

"EB2430"    36.81   364 222 4   72  430 101 461 1.00E-063   237
"EB3128"    26.04   169 108 6   42  206 17  172 6.00E-006   45.8
"EB3945"    20.6    233 162 6   106 333 33  247 6.00E-005   42.4
"EB3944"    19.07   367 284 6   1   355 1   366 2.00E-023   103 

с результирующей вкладкой вывода с разделителями:

'EB2430'   idnD   yjgV   b4267   36.81   364 222 4   72  430 101 461 1.00E-063   237
'EB3128'   yagE   b0268   26.04   169 108 6   42  206 17  172 6.00E-006   45.8
'EB3945'   maeB   ypfF   b2463   20.6    233 162 6   106 333 33  247 6.00E-005   42.4
'EB3944'   eutS   ypfE   b2462   19.07   367 284 6   1   355 1   366 2.00E-023   103

Вот мой код для создания словаря:

f = open ("one.csv", "r")
g = open ("second.csv", "r")
eb = []
desc = []
di = {} 

for line in f:
    for row in f:
        eb.append(row[1:7])
        desc.append(row[7:])

di = dict(zip(eb,desc))

Извините за то, что это так затянуто !! Я давно не программирую.

Ура!

Сб

Ответы [ 3 ]

2 голосов
/ 02 апреля 2010

Похоже, вы могли бы более полезно использовать стандартный модуль Python csv здесь. вместо того, чтобы выполнять части обработки текста самостоятельно "вручную". E.g.:

import csv
with open("one.csv", "r") as f:
  rows_one = list(csv.reader(f, delimiter='\t'))
with open("second.csv", "r") as g:
  rows_two = list(csv.reader(g, delimiter='\t'))
rows_totl = [r + s[1:] for r, s in zip(rows_one, rows_two)]
with open("total.csv", "w") as h:
  csv.writer(h, delimiter='\t').writerows(rows_totl)

Оператор with является одной из жемчужин Python 2.6 (его также можно использовать в 2.5, но только если вы from __future__ import with_statement! -) - как здесь используется, он дает вам открытый файл и гарантирует его закрытие как только тело with готово ... плюс, у него еще миллионы применений, например для блокировок и всевозможных ваших собственных «контекстных менеджеров».

0 голосов
/ 02 апреля 2010

Посмотрите на csv модуль:

import csv
reader1 = csv.reader(open('input1.csv'), delimiter = '\t')
reader2 = csv.reader(open('input2.csv'), delimiter = '\t')
csvwriter = csv.writer(open('output.csv', 'w'),delimiter = '\t')
while True:
    row1 = reader1.next()
    if row1:
       row2 = reader2.next()
       new_row = row2 + row1[1:]
       csvwriter.writerow(new_row)
    else:
        break
0 голосов
/ 02 апреля 2010

Могу я предложить вместо разбора файла CSV вручную использовать csv , который является встроенным. Он заботится о разделителях, экранировании символов и т. Д. Это тоже простой API:

import csv

# Auto-detector of this particular CSV dialect (delimiters and such)
dialect = csv.Sniffer().sniff(open('one.csv').read())

# csv.reader yields every row found in the file using the given dialect
rows = csv.reader(open('one.csv'), dialect = dialect)

# [list comprehension][2]
resulting_dict = dict((row[0], row[1:]) for row in rows)

Вы можете преобразовать код в функцию и использовать его для обоих файлов (хотя кодирование из памяти, но остерегайтесь ошибок).

Теперь у вас есть два диктанта для двух файлов, скажем, dict1 и dict2, вы можете объединить их:

combined_dict = dict((key, dict1[key] + dict2[key]) for key in dict2)

Запись в файл .csv также проста:

writer = csv.writer(open('second.csv', 'w'), delimiter = '\t')
for key, values in combined_dict:
    writer.writerow(key, *values)

Обязательно ознакомьтесь с документами для более подробного ознакомления.

Редактировать: Мое решение не учитывает порядок строк (dict неупорядочен). Есть два решения:

  • если вы работаете с Python 3 или Python 2.7, используйте collection.OrderedDict
  • в противном случае вам необходимо сохранить порядок строк - например, при чтении второго файла разбить понимание списка на стандартную инструкцию for и сохранить заголовки в списке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...