迭代文件并将值添加到 python 字典
Iterating over files and adding values to python dictionary
我有一组 50 个文本文件,所有文本文件都设置为第一个 header 行,第一列是基因名称,其余列是每个基因的值。我还有一个官方基因列表文本文件。我想使用官方的基因名称列表来构建字典,然后遍历文件,确定每一行的基因名称是否与字典中的基因名称匹配,如果匹配,则将字典值附加到字典中的附加值实验文件。
因此实验文件如下所示:
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' object 没有属性 'append' 的相同错误。
我以前做过字典,但从未尝试过像这样将新值附加到现有键。这可能吗?任何帮助或建议将不胜感激。
所以如果你想使用.append()
,你需要确保你追加的字典值是一个列表。看起来您将其设置为 combo[name]={}
,因此您收到了 'dict has no attribute' 错误。您可能应该尝试将 combo[name]={}
更改为 combo[name]=[]
以便稍后继续使用附加。
新编辑修复逻辑:
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.
你很接近这样做。
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
正如其他人所指出的,您不能附加到听写。
d = {}
初始化字典后,您可以像这样添加新键
d['new'] = 9
您可以通过这样做来覆盖现有密钥
d['new'] = 10
在您的情况下,您可能想尝试创建一个列表字典,然后附加到它。
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
我有一组 50 个文本文件,所有文本文件都设置为第一个 header 行,第一列是基因名称,其余列是每个基因的值。我还有一个官方基因列表文本文件。我想使用官方的基因名称列表来构建字典,然后遍历文件,确定每一行的基因名称是否与字典中的基因名称匹配,如果匹配,则将字典值附加到字典中的附加值实验文件。
因此实验文件如下所示:
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' object 没有属性 'append' 的相同错误。
我以前做过字典,但从未尝试过像这样将新值附加到现有键。这可能吗?任何帮助或建议将不胜感激。
所以如果你想使用.append()
,你需要确保你追加的字典值是一个列表。看起来您将其设置为 combo[name]={}
,因此您收到了 'dict has no attribute' 错误。您可能应该尝试将 combo[name]={}
更改为 combo[name]=[]
以便稍后继续使用附加。
新编辑修复逻辑:
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.
你很接近这样做。
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
正如其他人所指出的,您不能附加到听写。
d = {}
初始化字典后,您可以像这样添加新键
d['new'] = 9
您可以通过这样做来覆盖现有密钥
d['new'] = 10
在您的情况下,您可能想尝试创建一个列表字典,然后附加到它。
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