从列表创建列数据

时间:2013-11-21 08:12:24

标签: python text format tabular

我有一个包含以下数据的文本文件:

['p2_18c', 'p2_19c', 'p2_20c', 'p2_21c', 'p2_22c', 'p2_24c', 'p2_27c']
0.5180625  
0.5058125
nan
0.484625
0.484
0.455666666667
0.397214285714

我想对这些数据做什么是使用python重新格式化它,看起来像这样:

2            18            0.5180625
2            19            0.5058125
2            20            nan
2            21            0.484625
2            22            0.484
2            24            0.455666666667
2            27            0.397214285714

这是否可能,如果是这样,我将如何开始它,如果不可能,你认为我能得到的最接近的是什么?一如往常,任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:1)

我会使用ast.literal_eval将第一行解析为Python列表,然后将每个元素拆分为第一列和第二列,并迭代所有剩余行以获取第三列。

此代码

from ast import literal_eval

file_name = "20115571.txt"
file_name_out = "20115571_out.txt"

with open(file_name) as fh, open(file_name_out,"w") as fh_out:
    first_line = fh.readline()
    values = literal_eval(first_line)
    for value, line in zip(values, fh):
        first_column = value[1]
        second_column = value[3:5]
        third_column = line.strip()
        fh_out.write("%s\t%s\t%s\n" % (first_column, second_column, third_column))

将写入输出文件:

2   18  0.5180625
2   19  0.5058125
2   20  nan
2   21  0.484625
2   22  0.484
2   24  0.455666666667
2   27  0.397214285714

答案 1 :(得分:0)

其中一种方式是这样的:

>>> import ast
>>> data=open('./text.txt','r').readlines()
>>> a=[x.strip('pc').split('_') for x in ast.literal_eval(data[0].strip())]
>>> for x,y in zip(a,data[1:]):
    x.append(y.strip())


>>> a
[['2', '18', '0.5180625'], ['2', '19', '0.5058125'], ['2', '20', 'nan'], ['2', '21', '0.484625'], ['2', '22', '0.484'], ['2', '24', '0.455666666667'], ['2', '27', '0.397214285714']]

答案 2 :(得分:0)

您可以尝试:

$ cat t.py
#/usr/bin/env python

with open("data") as file:
    col_1_2=eval(file.readline().strip())

    for row in col_1_2:
        print "\t".join(row[1:-1].split('_') + [file.readline().strip()])

给出:

$ python t.py 
2   18  0.5180625
2   19  0.5058125
2   20  nan
2   21  0.484625
2   22  0.484
2   24  0.455666666667
2   27  0.397214285714

请注意,如果您不信任该文件的内容,则应使用ast.literal_val而不是eval