我的程序需要帮助。 我想阅读我的标签文件,然后在该文件中添加一个新列(ab),我想从字典中获取(hi)。
我的词典名为hi
,我希望列中的数据来自ab
。
数据应该位于字典中正确的special_name旁边。请看一下我的例子。
我的标签文件如下:
Names names_id first second special_name
lili 1 a b Tm
Katrin 2 c d Tm
Paul 3 e f ui
bob 4 g h zb
tina 5 i j ac
应该看起来像:
Names names_id first second special_name ab
lili 1 a b Tm a
Katrin 2 c d Tm a
Paul 3 e f ui f
bob 4 g h zb b
tina 5 i j ac a
我的脚本如下:
with open("myData.tab","r") as file:
hi = {'ac':{'ab': 'a', 'po':'pb'},
'Tm':{'ab': 'a', 'po':'h'},
'ui':{'ab': 'b', 'po':'h'},
'zb':{'ab': 'f', 'po':'j'}}
for line in file:
line = line.strip()
columns = line.split("\t")
print(line)
for row in columns:
file.append('ab')
当我打印它时,我得到了整个数据,但没有标题和没有字典。我将不胜感激任何帮助。
答案 0 :(得分:0)
以下代码在您的问题中提供您想要的输出。 与原始帖子相比,有一些事情需要考虑。
with open('myData.tab.tab','r') as input_file:
hi = {'ac':{'ab': 'a', 'po':'pb'},
'Tm':{'ab': 'a', 'po':'h'},
'ui':{'ab': 'b', 'po':'h'},
'zb':{'ab': 'f', 'po':'j'}}
columns=[]
for line in input_file:
line = line.strip()
columns.append(line.split('\t'))
output_list = [columns[0]+['ab']]
for row in columns[1:]:
row.append(hi[row[-1]]['ab'])
output_list.append(row)
with open('myData.tab2.tab','w') as output_file:
for row in output_list:
output_file.write("\t".join(row)+'\n')
与原始帖子比较时,文件仍然打开相同。字典仍然创建相同我只将文件对象名称从file
更改为input_file
。
在此代码中,创建了一个名为columns
的空列表。然后,我们遍历文件中的每一行,与您在代码中所做的非常相似。唯一的区别是我们将每一行追加到columns
列表。
循环遍历文件中的每一行后,我们创建一个output_list
,我们向其添加第一行(带有标题的行)并将'ab'字符串添加到headerrow中。
然后我们循环遍历非标题行的每一行以及对应于特殊名称的hi
字典到每行的值。然后我们将行添加到output_list
。
然后我们打开一个不同的文件,并从我们的ouput_list写入每一行。导致此输出(结果是制表符分隔,在SO上仅限于间隔不足)。
Names names_id first second special_name ab
lili 1 a b Tm a
Katrin 2 c d Tm a
Paul 3 e f ui b
bob 4 g h zb f
tina 5 i j ac a
注意事项:如果KeyError
字典中没有出现special_name列下的任何值,此代码将为您提供hi
。为简单起见,我选择了最容易理解的实现。但KeyError
您不必将output_list写入单独的文件,您可以将myData2.tab
更改为myData.tab
但是这将从头开始完全重写该文件。如果出现任何问题,您可能会丢失原始文件。所以我个人的偏好是(在可能的情况下)写入新文件。这样你就不会丢失原始输入。
答案 1 :(得分:0)
我建议您使用Python的csv
库来执行此操作,因为它会使事情变得更容易:
import csv
hi = { 'ac':{'ab': 'a', 'po':'pb'},
'Tm':{'ab': 'a', 'po':'h'},
'ui':{'ab': 'b', 'po':'h'},
'zb':{'ab': 'f', 'po':'j'}}
with open('myData.tab', 'rb') as f_input, open('myData output.tab', 'wb') as f_output:
csv_input = csv.reader(f_input, delimiter='\t')
csv_output = csv.writer(f_output, delimiter='\t')
# Copy over the header to the output file and add the new column
csv_output.writerow(next(csv_input) + ['ab'])
for row in csv_input:
row.append(hi[row[4]]['ab'])
csv_output.writerow(row)
为您提供制表符分隔的输出文件,并从输入的csv文件中正确复制您的标题:
Names names_id first second special_name ab
lili 1 a b Tm a
Katrin 2 c d Tm a
Paul 3 e f ui b
bob 4 g h zb f
tina 5 i j ac a
csv
库能够自动读取文件的每一行并将其正确转换为列表。写回文件时,您需要做的就是给它一个列表,它会自动在每个值之间添加必要的分隔符。当您需要处理可能包含分隔符本身的字符串时,这变得更加重要。