Python创建字典并交换到另一个文件

3 投票
3 回答
565 浏览
提问于 2025-04-15 21:08

我有两个用制表符分隔的 .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 中,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))

抱歉写得有点啰嗦!我编程时间不长。

谢谢!

Sat

3 个回答

0

我建议你不要手动解析CSV文件,可以使用Python自带的csv模块。这个模块可以自动处理分隔符、字符转义等问题。而且它的使用方法也很简单:

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)

你可以把代码整理成一个函数,这样就可以同时处理两个文件(我只是凭记忆写的,可能会有错误哦)。

现在你有了两个字典,分别是dict1dict2,你可以把它们合并在一起:

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)

一定要查看一下文档,里面有更详细的说明。

编辑:我的解决方案没有考虑行的顺序(字典是无序的)。有两种解决办法:

  • 如果你使用的是Python 3或者Python 2.7,可以使用collections.OrderedDict。
  • 否则,你需要记录行的顺序——比如在读取第二个文件时,把列表推导式改成标准的for循环,并把表头存储在一个列表中。
0

看看这个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
2

看起来你可以更有效地使用Python自带的库中的csv模块,而不是自己“手动”处理文本部分。例如:

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语句时,它会帮你打开一个文件,并确保在with代码块结束后自动关闭这个文件……而且,它还有很多其他用途,比如用来处理锁和你自己编写的各种“上下文管理器”。

撰写回答