我有三个表,需要创建第四个表,将前三个中的所有信息分组。
文件1:包含table4感兴趣的键。file1.txt:
a namex 23 14
b nameY 30 18
c nameZ 10 20
文件2:根据[2]从[1]和[3]收集信息。
生成这样的字典:
DICT2 = {'X':['nameX','infoX'],'Y':['nameY','infoY'],'Z':['nameZ','infoZ']}
file2.txt:
[0] [1] [2] [3] [4] [5]
idX nameX X infoX ... descriptionX
idY nameY Y infoY ... descriptionY
idZ nameZ Z infoZ ... descriptionZ
文件3:用于附加到DICT1末尾的'a','b'和'c'的值。
file3.txt
a 1 0 1 0 0
b 0 3 8 2 0
c 3 5 3 4 1
我的剧本:
file1 = open('file1.txt', 'r')
file2 = open('file2.txt', 'r')
file3 = open('file3.txt', 'r')
DICT1 = {}
DICT2 = {}
DICT3 = {}
for line in file1:
row = line.strip().split('\t')
if row[0] not in DICT1:
DICT1[row[0]] = row[1:]
for line2 in file2:
row2 = line2.strip().split('\t')
if row2[1] not in DICT2:
DICT2[row2[1]] = row2[2], row2[5]
for line3 in file3:
row3 = line3.strip().split('\t')
name = line3[0].strip()
count = line3[1:]
if name not in DICT3:
DICT3[name] = count
if name in DICT1 and DICT2:
print(name + '\t' + DICT2[key] + str('\t'.join(count)) + '\t' +
str('\t'.join(DICT1[name])))
当我尝试将DICT3的值包含在打印中时,DICT2的第一个键重复到所有(表中的X):
a X 1 0 1 0 0 nameX 23 14
b X 0 3 8 2 0 nameY 30 18
c X 3 5 3 4 1 nameZ 10 20
我想获得的输出如下:
a X 1 0 1 0 0 nameX 23 14
b Y 0 3 8 2 0 nameY 30 18
c Z 3 5 3 4 1 nameZ 10 20
提前谢谢你。
答案 0 :(得分:0)
让我们先开始清理代码,看看我们是否可以到达你想要的地方
首先,您有包含分隔数据的文本文件。无论何时,只要您查看它,就应该依靠csv
模块来解析它。如果你有一个为你做的stdlib模块,请不要尝试按行读取并使用分隔符进行拆分。实现意外的实施错误太容易了。
其次,使用with
关键字打开您的文件。这使您不必在以后关闭它们(并且可能忘记),这只是一种很好的做法。
import csv
with open("file1.txt") as file1, open("file2.txt") as file2, \
open("file3.txt") as file3:
readers = [csv.reader(f, delimiter="\t") for f in [file1, file2, file3]]
# readers[0] is file1
# readers[1] is file2
# readers[2] is file3
现在让我们来看看你是如何创建这些词典的。那里有很多if key not in dict: dict[key] = data
。你实际认为你有重复的数据并且试图忽略其余的数据吗?如果是这样,好的,继续这样做!如果没有,请放弃并执行:
# still inside the `with` block from the last snippet
dicts = []
dicts.append({k: vs for k, *vs in readers[0]})
dicts.append({one: (two, five) for _, one, two, _, _, five, *_ in readers[1]}
dicts.append({k: vs for k, *vs in readers[2]})
# dicts[0] is DICT1
# dicts[1] is DICT2
# dicts[2] is DICT3
现在我们已将所有数据制成表格,我们可以生成输出:
# no longer need to be inside the `with` block
result = [[abbr, dicts[1][name][0], *dicts[2][abbr], name, *vs] for abbr, (name, *vs) in dicts[0].items()]
那个古老丑陋的东西应该会给你正确的结果,尽管你必须加入字符串才能做到。
for row in result:
print("\t".join(row))
您的代码存在许多错误,因此很难分解出错的确切方法。最终打印行中DICT2.key[]
之类的内容可能是DICT2.keys()
,但应该抛出您未报告的错误消息,如果提供的代码不是,我会毫不犹豫地猜测出了什么问题。 #39;编写的代码!