遍历文件并将值添加到python字典

时间:2019-10-23 16:09:43

标签: python dictionary append defaultdict

我有一组50个文本文件,所有文件都设置有第一标题行,第一列是基因名称,其余列是每个基因的值。我也有一个官方的基因列表文本文件。我想使用正式的基因名称列表来构建字典,然后遍历文件,确定每一行的基因名称是否与字典中的基因名称匹配,如果匹配,请在字典值后附加来自实验文件。

实验文件如下:

GENE    Exp1    Exp2
geneA   12      34
geneB   42      10
geneC   42      10

官方基因列表如下:

GENE    
geneA   
geneC

我尝试使用defaultdict和以下代码(仅适用于一个实验文件,但稍后可能会迭代更多内容):

combo = {}

with open('official_gene_list.txt', 'r') as f:
    f.readline()
    for line in f:
        name = line.split('\n')[0]
        combo[name]={}

with open('expeirmenta1_file.txt', 'r') as g:
for each in g:
    name2 = each.split('\t')[0]
    data = each.rstrip('\n').split('\t')[1:]
    for name2 in combo:
        combo[name2].append(data)

但是每当我这样做时,字典就没问题了,但是出现以下错误:

AttributeError: 'dict' object has no attribute 'append'

我也尝试使用defaultdict():

from collections import defaultdict
combo = defaultdict(list)
with open('gene_orf_updated2.txt', 'r') as f:
    f.readline()
    for line in f:
        name = line.split('\n')[0]
        combo[name]={}
with open('GSE139_meanCenter_results.txt', 'r') as g:
    for each in g:
        name2 = each.split('\t')[0]
        data = each.rstrip('\n').split('\t')[1:]
        for name2 in combo:
            combo[name2].append(data)

我也收到关于“ dict”对象没有属性“ append”的相同错误。

我之前做过字典,但是从未尝试过将新值附加到现有的键上。这可能吗?任何帮助或建议,将不胜感激。

4 个答案:

答案 0 :(得分:0)

因此,如果要使用.append(),则需要确保要附加的字典值是一个列表。似乎您将其设置为combo[name]={},因此您收到“字典没有属性”错误。您可能应该尝试将combo[name]={}更改为combo[name]=[],以便以后继续使用附加。

新的Edit修复逻辑:

for each in g:
    # name2 = each.split('\t')[0]
    data = each.rstrip('\n').split('\t')[1:]
    for key_name in combo: # For every 'value' (each individual list) in the dictionary
        combo[key_name].append(data) # Add the this lines data. 

答案 1 :(得分:0)

你很亲密,像这样

combo = {}

with open('gene_orf_updated2.txt', 'r') as f:
    for line in f:
        name = line.split('\n')[0]
        combo[name]= []
with open('GSE139_meanCenter_results.txt', 'r') as g:
    for each in g:
        name2 = each.split('\t')[0]
        data = each.rstrip('\n').split('\t')[1:]
        if name2 in combo:
            combo[name2].append(data)

如果要删除嵌套列表,请执行此操作。

combo[name2] += data

答案 2 :(得分:0)

正如其他人指出的那样,您不能附加字典。

d = {}

初始化字典后,您可以像这样添加新键

d['new'] = 9

您可以通过此操作覆盖现有密钥

d['new'] = 10

在您遇到的情况下,您可能想要尝试创建列表字典,然后将其追加。

答案 3 :(得分:0)

import pandas as pd

def print_file(f_name):
    print('\n\n'+f_name)
    print('*'*10)
    print(open(f_name,'r').read())

gene_fname = 'genes.txt'
print_file(gene_fname)
gene = pd.read_csv(gene_fname)
df_final = pd.DataFrame(gene)
df_final['combined'] = [list() for x in range(len(df_final.index))]

for val in ['values1.txt','values2.txt','values3.txt','values4.txt']:
    print_file(val)
    val_df = pd.read_csv(val,header=0,delim_whitespace=True)
    df_final = pd.merge(df_final,val_df,on='GENE',how='left')
    df_final['new'] = df_final.loc[:,df_final.columns.difference(['GENE','combined'])].values.tolist()
    df_final['combined'] = df_final['new']+df_final['combined']
    df_final.drop(df_final.columns.difference(['GENE','combined']),1,inplace=True)

df_final['combined'] = df_final['combined'].apply(lambda x: [int(i) for i in x if str(i) != "nan"])
print('\n\n')
print(df_final)

Output