首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -从文件中的第一列计算第二列

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

Stack Overflow用户
提问于 2015-09-10 14:07:28
回答 3查看 1K关注 0票数 5

我是Python的初学者,不能应付我的项目的某个时刻,所以我很高兴你能帮我:)

让我们想象一下,我有一个*.txt文件,它只有一个列,如下所示:

代码语言:javascript
复制
         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

*此处添加了带有行的列,以简化解释。

我需要计算第二列,该列接受来自列-1的输入数据,并输出从上一列减去此行值的结果(如果行-1(列-1)值为0,则行-1(列-2)中的值也应为0)。它应该是:

  • 行-2(列-2)=行-2(列-1)-行-1(列-1)
  • 行-3(列-2)=行-3(列-1)-行-2(列-1)等等。

让我向您展示输出文件应该是什么样的:

代码语言:javascript
复制
         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

现在我只带着我的程序来这里:

代码语言:javascript
复制
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适合这个任务?我在这方面不强(基本上,我一点也不知道),我应该学吗?

不管怎样,我真的很感谢你的贡献。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-10 14:24:41

我相信这会像你要求的那样:

代码语言:javascript
复制
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()
票数 5
EN

Stack Overflow用户

发布于 2015-09-10 14:30:02

一种方法可以是:假设您有两个列表:

代码语言:javascript
复制
a = [1,2,3,0]
b = [0,1,2,3]

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

代码语言:javascript
复制
import operator
map(operator.sub, a, b)

要做到这一点,您需要将文件读取为数组(使用array.append(value)获取所有数据)。

然后复制一份数据,并将其偏移一份(列表长度必须相同)。如何处理数组的开始和结束取决于这些值对您的重要性(也许您可以承担损失一个值的代价)。

票数 2
EN

Stack Overflow用户

发布于 2015-09-10 14:34:33

下面是一个使用列表理解和压缩的解决方案:

代码语言:javascript
复制
#!/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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32504143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档