如何将单个列从输入文本文件保存到python中的各个输出文本文件

时间:2018-03-29 01:48:35

标签: python arrays for-loop text-files nested-loops

我刚刚开始使用python(anaconda3),我无法弄清楚应该非常简单的问题...我已经在互联网上搜索了一个解决方案,但我找不到它。

目标:我希望我的脚本将单个列(通过--column索引)从输入文本文件写入相应的输出文本文件。用户可以选择任意数量的列(具有匹配的输出文件数)。

示例:python septc.py --infile infile.txt --column 0 2 3 --outfile out1.txt out2.txt out3.txt

我的问题:

  1. 如何在相应的输出文件中保存由--column vector定义的输入文件的各个col?
  2. 用户给出的col的索引号可能会偏离1,因为用户开始计数col为1而python从0开始,所以选择最后一个col将超出界限...虽然我可以在帮助中说计数从0开始的脚本文件。
  3. 下面的脚本应该打印infile的第1,第3和第4列,但它会将所有三个col写入每个输出文件,而不是将第1列写入out1.txt,将第3列写入out2。 txt和第4列进入out3.txt。这是bc,内循环是针对外循环的每个实例执行的。同样,更改循环顺序会在每个输出文件中写入第4个col,这不是我想要的。我尝试了其他方法(例如,对于np.nditer(col)中的c),但无济于事。

    我怀疑这种for循环方法在这里不合适。它应该类似于将c写入相关文本文件中的c ...但是如何将col链接到其输出文件?!

    我非常感谢你的帮助!

    提前多多谢谢你,

    尼克

    cols = [0,2,3]
    data = np.arange(20).reshape(5,4)
    np.savetxt('infile.txt', data, delimiter='  ', fmt='%1.0f')
    f = np.loadtxt('infile.txt')
    array([[  0.,   1.,   2.,   3.],
           [  4.,   5.,   6.,   7.],
           [  8.,   9.,  10.,  11.],
           [ 12.,  13.,  14.,  15.],
           [ 16.,  17.,  18.,  19.]])
    
    ######### Script (shorter version) #########
    #!/usr/bin/env python
    import numpy as np
    import sys
    import argparse
    # Parse cmd line arguments
    p = argparse.ArgumentParser()
    p.add_argument('--infile', nargs='?', action="store", default=sys.stdin)
    p.add_argument('--column', nargs='+', action="store", type=int)
    p.add_argument('--outfile', nargs='+', action="store", default=sys.stdout)
    nargs = p.parse_args()
    # Assign cmd line arguments to variables
    col = nargs.column
    outfile = nargs.outfile
    infile = nargs.infile
    with open(infile) as infile:
        data = np.loadtxt(infile)
    # This is supposed to save each col into its respective output file ... supposed to ...
    for out in outfile:
        with open(out, 'wb') as f:
            for c in col:
                y = data[:,c]
                np.savetxt(f, y, fmt='%1.0f')
    

1 个答案:

答案 0 :(得分:1)

您正在遍历每个outfile的所有列。尝试使用zip来形成列和outfiles之间的关系。然后只需将各列的文本保存到相应的文件中。

详情了解内置函数zip here

for out, c in zip(outfile,col):
    with open(out, 'wb') as f:
        y = data[:,c]            
        np.savetxt(f, y, fmt='%1.0f')

希望这有帮助。

<强>结果:

$ python col2files.py  --infile infile.txt --column 0 2 3 --outfile out1.txt out2.txt out3.txt

$ cat out1.txt
0
4
8
12
16

$ cat out2.txt
2
6
10
14
18

$ cat out3.txt
3
7
11
15
19