首页 文章

Python - 计算文件中第一列的第二列

提问于
浏览
5

我是Python的初学者,无法应对我项目的其中一个时刻,所以我很乐意帮助我:)

让我们想象一下,我有一个* .txt文件,只有一列看起来像:

Column-1

row-1    0
row-2    25.00
row-3    27.14
row-4    29.29
row-5    31.43
row-6    33.57

*此处添加了带行的列,以简化说明 .

我需要计算从Column-1作为输入数据的第二列,并输出从前一行中减去该行值的结果(如果row-1(Column-1)值为0,则应该是它应该是第1行(第2列)中的0也是如此 . 应该是这样的:

  • row-2(Column-2)= row-2(Column-1) - row-1(Column-1)

  • row-3(Column-2)= row-3(Column-1) - row-2(Column-1),依此类推 .

让我告诉你输出文件应该如何:

Column-1  Column-2

row-1    0         0
row-2    25.00     25.00
row-3    27.14     2.14
row-4    29.29     2.15
row-5    31.50     2.21
row-6    33.57     2.07

现在我只在这里编程:

import sys

with open('file.txt', "r") as f:
    sys.stdout = open('%s (calc).txt' % f.name, 'a')
    for line in f:
        column = line.strip().split()
        Column_1 = float(column[0])
        column.extend([None])

我不知道下一步该做什么 . 也许,numpy适合这项任务?我不坚强(基本上,我根本不知道),我应该学习它吗?

无论如何,我真的很感谢你的贡献 .

3 回答

  • 5

    这是一个使用列表推导和zip的解决方案:

    #!/usr/bin/env python3
    
    with open('file.txt', "r") as f:
    
        # read column one into a list
        column_1 = [float(line.strip()) for line in f]
        # compute differences of neighbouring values
        column_2 = [now - last for now, last in zip(column_1, [0.0]+column_1[:-1])]
    
        with open("result.txt", "w") as outfile:
            for c1, c2 in zip(column_1, column_2):
                print("{:.2f}\t{:.2f}".format(c1, c2), file=outfile)
    

    这里发生的是我们首先从输入文件创建所有条目的列表 . 通过使用zip,我们可以从两个(或更多)可迭代创建元组 . 我们必须创建第二个列表,其值移动1并在前面添加0.0作为第一个条目的标记 .

    现在我们可以将这两个列表压缩在一起,并使用第二个列表推导计算值对之间的差异 .

    学习numpy总是一个好主意,但我认为这对于这项任务来说太过分了 .

  • 2

    我相信这会做你所问的:

    INPUT = 'file.txt'
    OUTPUT = 'calc.txt'
    
    def main():
        with open(INPUT, 'r') as reader, open(OUTPUT, 'a') as writer:
            last_value = 0
            for line in reader:
                column_1, *remaining_columns = map(float, line.split())
                column_2 = column_1 - last_value
                last_value = column_1
                print(column_1, column_2, sep='\t', file=writer)
    
    if __name__ == '__main__':
        main()
    
  • 2

    一种方法可能如下:假设您有两个列表:

    a = [1,2,3,0]
    b = [0,1,2,3]
    

    然后,您可以使用以下步骤从另一个列表中减去一个列表:

    import operator
    map(operator.sub, a, b)
    

    为此,您需要将文件作为数组读入(使用 array.append(value) 获取所有数据) .

    然后复制数据,并将其偏移一个(列表长度需要相同) . 如何处理数组的开头和结尾取决于这些值对您的重要程度(也许您可以承受损失一个值) .

相关问题