Python创建字典并交换到另一个文件
我有两个用制表符分隔的 .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)
你可以把代码整理成一个函数,这样就可以同时处理两个文件(我只是凭记忆写的,可能会有错误哦)。
现在你有了两个字典,分别是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)
一定要查看一下文档,里面有更详细的说明。
编辑:我的解决方案没有考虑行的顺序(字典是无序的)。有两种解决办法:
- 如果你使用的是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
代码块结束后自动关闭这个文件……而且,它还有很多其他用途,比如用来处理锁和你自己编写的各种“上下文管理器”。