我是python新手,为两个制表符分隔的输入文件创建了两个数组,我正在寻找一种方法,将一个数组的列(element)与另一个数组的元素进行数值比较。有什么办法吗那个。我的代码如下
#!/usr/bin/python
import sys
from array import *
#print len(sys.argv)
if len(sys.argv) != 4:
print 'Usage: python scores.py <infile1> <infile2> <outfile>'
sys.exit(1)
f1 = open ("12877overlappedallvariants.gvf", "r")
f2 = open ("unmatched.12877overlappedallvariants.gvf", "r")
f3 = open ("out.txt", "w")
for line in f1.readlines():
cols = line.split('\t')
#print cols[5:6]
for line in f2.readlines():
cols1 = line.split('\t')
#print cols1[5:6]
我尝试了下面的代码部分,但不起作用
^{2}$我正在尝试查看array1的元素5是否等于、大于或小于array2的元素5。感谢任何帮助。谢谢。在
首先需要注意的是,在读取文件之后,只存储最后一行(在一个名为“cols”的变量中;)。像这样的循环:
可能更合适。这将把两个文件的全部内容读入内存中当然也有一些方法不需要同时读取那么多数据,但有时这是最简单的。
zip
可能有点混乱,但基本上,它将file1的第一行与file2的第一行匹配,然后将两个文件的第二行匹配,依此类推。。。在如@Lattyware在评论中所述,上述内容相当于:
^{pr2}$因为文件可以被迭代。在Python2中,它仍然会同时读取/存储这两个文件,但在Python3中,每次只能从每个文件中生成一行。最后,如果不想在python2中存储文件的所有内容,可以使用
itertools.izip
它的工作原理与
zip
相似,只是每次只生成一个元素。这里的缺点是,itertools.izip
在移到python3时消失了……但是,在本例中,2to3
应该进行适当的转换。(更多信息请参见评论)。在至于比较,这在很大程度上取决于文件包含的内容。如果它包含数字,你可以这样做。。。在
如果没有
map(float,...)
位,python将进行字符串比较。在python还有一个cmp function,如果您想现在比较并在以后使用比较的结果,这可能会很有用。在
值得注意的是,这些是列表,而不是数组。这是有区别的。在
每次循环时都会重写
cols
这意味着您只会得到最后一行数据-列表理解是为了得到您想要的所有数据,或者更好的是,根本不存储数据-对它执行您想要的操作。在比较时的主要问题是,您正在获取列表切片,而不仅仅是获取所需的元素。这太复杂了。在
因此,正如我在评论中提到的,您可以对初始代码进行许多改进,主要是
with
语句和csv
模块。在因此,首先,使用
with
语句打开文件。我们也使用csv.reader()
,使用"excel-tab"
方言作为制表符分隔的文件,csv.QUOTE_NONNUMERIC
告诉它值是数字,所以以后不必从字符串转换它们。请注意,如果只有某些值是数字,则需要引用所有非数字值才能使用此方法,或者显式转换这些值而不使用它。在要执行检查,只需执行如下操作(在上面的
^{pr2}$with
块中继续):注意使用zip可以同时循环两个文件。我们需要在文件每次返回一行时对其进行循环,每行是每列的数据列表。然后您可以随意处理数据。我已经给出了一个比较第五个值的例子(注意索引
4
-python是0
索引的——也就是说,第一个值是0
,所以第五个值是4
)。在通过在文件循环过程中执行这些操作,我们可以确保不必创建列表并临时存储数据—如果我们最终处理的是大文件,这一点很有用。在
如果您以后需要大量使用该数据,并且希望它作为一个列表,那么您可以简单地将两个
rows
对象列表,方法是在csv.reader()
周围包装一个list()
调用我会这样写:
`
cmp返回-1表示lt,0表示eq,或1表示gt
如果行?[5] 是数字,则…
^{pr2}$相关问题 更多 >
编程相关推荐