我想制作一个python脚本,用上一个值减去最新的值,并将结果保存在新文本文件的新列中
在一个文本文件中,我有一列数据点,范围从1到19999,我想用以前的值减去每个新值,并将答案保存在一个新文本文件的新列中 我的数据点(列中)在文本文件中的索引号如下所示:我想制作一个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 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