在tabfi中插入词典

2024-06-17 02:37:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我的计划需要帮助。 我想阅读我的标签文件,然后添加一个新的列(ab)到该文件,我想从字典(hi)获得。你知道吗

我的字典名为hi,对于列,我需要来自ab的数据。 数据应该与字典中正确的特殊名称相邻。请看一下我的例子。你知道吗

我的选项卡文件如下所示:

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')

当我打印的时候,我得到了所有的数据,但是没有标题和字典。如果有任何帮助,我将不胜感激。你知道吗


Tags: 文件数据idui字典abnamesline
2条回答

我建议您使用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库能够自动读取文件的每一行,并将其正确地转换为列表。当写回一个文件时,你所需要做的就是给它一个列表,它会在每个值之间自动添加必要的分隔符。当您需要处理可能包含分隔符本身的字符串时,这一点变得更加重要。你知道吗

下面的代码提供了问题中所需的输出。 不过,与你原来的帖子相比,有一些事情需要考虑。你知道吗

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。 然后我们打开一个不同的文件,并将输出列表中的每一行写入其中。结果是这个输出(结果是制表符分隔的,所以这里的间隔很小)。你知道吗

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

注意:如果特殊名称列下的任何值不在hi字典中,那么这段代码将为您提供一个KeyError。为了简单起见,我选择了最容易理解的实现。但它是脆弱的KeyError

您不必将输出列表写入一个单独的文件,您可以将myData2.tab更改为myData.tab,但是这将从零开始完全重写文件。如果出现任何问题,您可能会丢失原始文件。所以我个人的偏好是(如果可能的话)写一个新文件。这样就不会丢失原始输入。你知道吗

相关问题 更多 >