我想制作一个python脚本,用上一个值减去最新的值,并将结果保存在新文本文件的新列中

我想制作一个python脚本,用上一个值减去最新的值,并将结果保存在新文本文件的新列中,python,Python,在一个文本文件中,我有一列数据点,范围从1到19999,我想用以前的值减去每个新值,并将答案保存在一个新文本文件的新列中 我的数据点(列中)在文本文件中的索引号如下所示: 1 66.295962 2 66.318076 3 66.479436 4 66.460284 5 66.551778 6 66.303606 7 66.222943 8 66.50905 9 66.268011 10 66.291807 . . . . . . . . 19993 69.303592

在一个文本文件中,我有一列数据点,范围从1到19999,我想用以前的值减去每个新值,并将答案保存在一个新文本文件的新列中

我的数据点(列中)在文本文件中的索引号如下所示:

1 66.295962
2 66.318076
3 66.479436
4 66.460284
5 66.551778
6 66.303606
7 66.222943
8 66.50905
9 66.268011
10 66.291807
.    .
.    .
.    .
.    .
19993 69.303592
19994 69.384204
19995 69.375126
19996 69.417533
19997 69.296388
19998 69.284336
19999 69.403861
如何用python编写此程序,如有任何帮助,将不胜感激。。提前感谢,我已经尝试将我的列转换为列表,但我不知道如何减去值并将答案保存在新文本文件的新列中

我的程序如下所示:

f = open ('infilename', 'r')
for line in f:
    line = line.strip()
    columns = line.split()
   # for i in xrange(len(columns)):
    print columns[1]

import csv

#open file
infile = open('infilename', 'r')

#define csv reader object, assuming delimiter is tab
tsvfile = csv.reader(infile, delimiter='\t')

lines = []

## iterate through lines in file
for line in tsvfile:
    lines.append(line)

print "Col1",[line[0] for line in lines]

我想到了这个:

input_list = [(i, float(num.split()[1])) for i, num in enumerate(f.read().splitlines())]
output_list = [input_list[i[0]][1] - input_list[i[0]-1][1] for i in input_list if i[0] != 0]
给我这个:

0.022114
0.16136
-0.019152
0.091494
-0.248172
-0.080663
0.286107
-0.241039
0.023796

您可以使用
CSV
模块读取文件,然后使用
itertools.izip
访问预期对,然后写入输出:

import csv
from itertools import izip_longest
from operator import sub
with open('new.txt', 'r') as csvfile,open('out.txt','w') as out:
     spamreader = csv.reader(csvfile, delimiter=' ')
     z=izip_longest(*spamreader)
     next(z)
     z=next(z)
     try :
        for i,j in izip_longest(z,z[1:]):
           out.write(str(sub(float(j),float(i)))+'\n')
     except:
        pass
请注意,
izip_longest
返回一个包含您的列的生成器,您可以通过
next
方法访问生成器的项。在这种情况下,我们不需要第一列即ID,因此在调用
next
后,请将另一个
next
方法即数字列的结果放入。然后再次对该列应用
izip_longest
函数以获得预期的对

还要注意的是,
spamreader
是一个csv阅读器对象,它返回一个包含所有行的生成器

演示:

#your file

1 66.295962
2 66.318076
3 66.479436
4 66.460284
5 66.551778
6 66.303606
7 66.222943
8 66.50905
9 66.268011
10 66.291807

#output

0.022114
0.16136
-0.019152
0.091494
-0.248172
-0.080663
0.286107
-0.241039
0.023796

作为noob,我建议使用Python和NumPy来处理和处理表格形式的数据。大多数安装都带有NumPy(或Pandas),因此它是工具包中值得使用的工具。请原谅格式,我不习惯这个网站

这是文件示例(我无法格式化,因此它位于单独的行中):

做一些进口,

>>> import numpy as np
>>> import numpy.lib.recfunctions as rfn
将文本文件作为具有设置数据类型(dtype)的数组加载

通过合并原始数组和差异来创建输出文本文件 数组(用一些含糊不清的词描述如何使用)

最后创建输出表并另存为文本文件,试图保留一些 格式的相似性

>>> np.savetxt("f:/test/out.txt", out, delimiter="",fmt='% 10i % 10.6f % 10.6f')
结果如下(您可以放置标题等)


注意……第3列中的最后一个条目是第2列中最后一个值和第一个值之间的差值。差异所在位置与原始值之间的配对取决于是向前滚动还是向后滚动。在给出的示例中,我向后滚动,因此第一个差异在第2列中的第一个值和第二个值之间。这可以根据您的目的进行调整,最终/第一个值可以设置为0,取决于您是向前滚动还是向后滚动。

您所说的
新值
以前的值
是指例如第1,2和2,3行还是第1,2和3,4行等等?我的意思是我想用索引19999处的值减去索引19998处的值,依此类推到第一个索引,并希望将列中的值保存到新的文本文件中。减法应该是一种关系:n=(n)-(n-1)除第一个值外,其他值都是正确的,因为我们的程序是从第一个指数中减去第十个指数。。。。方法应该是n=(n)-(n-1),其中n是索引号…在最后一个列表中添加了
if
。这更像是你需要的吗?@LifeSciences这不是解决这个问题的正确方法。它使用了大量的索引,也用于长列表,从内存效率和速度效率的角度来看,它非常低效!!是的,它正在工作,请解释一下程序背后的逻辑。。我真的很感谢你……)@生命科学欢迎!我在做那件事!这里你需要的只是一点生成器和
zip
。但是为什么你的答案显示为负值,例如索引2-索引1 66.318076-66.295962=0.022114,但是你的值显示为负值,如何更正@LifeSciences您只需更改
i
j
的位置,但如何从文本文件或保存在文本文件中的大型数据集创建数组,例如,我有19999个数据集保存在文本文件中。。。我的意思是说numpyarray是如何自动获取输入的??你的程序对我来说非常简单,我真的很感谢你。但是让我知道如何将19999索引的数据点输入到数组中?示例来自文本文件,如示例行所示。。。f=np.loadtxt(“f:/test/test.txt”),它是text.txt
>>> f = np.loadtxt("f:/test/test.txt",dtype=[('ID','int32'),('Value','float64')])
>>> f
array([(1, 66.295962), (2, 66.318076), (3, 66.479436), (4, 66.460284),
       (5, 66.551778), (6, 66.303606), (7, 66.222943), (8, 66.50905),
       (9, 66.268011), (10, 66.291807)], 
      dtype=[('ID', '<i4'), ('Value', '<f8')])
>>> a = f['Value']
>>> a1 = np.roll(a,-1)
>>> diff = a1-a
>>> out = rfn.merge_arrays((f, diff), asrecarray=True, flatten=True)
>>> np.savetxt("f:/test/out.txt", out, delimiter="",fmt='% 10i % 10.6f % 10.6f')
     1  66.295962   0.022114
     2  66.318076   0.161360
     3  66.479436  -0.019152
     4  66.460284   0.091494
     5  66.551778  -0.248172
     6  66.303606  -0.080663
     7  66.222943   0.286107
     8  66.509050  -0.241039
     9  66.268011   0.023796
    10  66.291807   0.004155