在tabfile中插入字典

时间:2017-08-30 12:04:50

标签: python dictionary

我的程序需要帮助。 我想阅读我的标签文件,然后在该文件中添加一个新列(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')

当我打印它时,我得到了整个数据,但没有标题和没有字典。我将不胜感激任何帮助。

2 个答案:

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