并行比较两个字符串

时间:2018-10-25 18:55:55

标签: python pattern-matching sequence

我有两个 sorted 文本文件,都包含相同 600个样本的蛋白质序列,只是我们使用不同的方法来获取序列。现在,我们想比较两个文件中的序列,看看它们是否彼此一致。

这是高通量序列比对/比较,所以我想编写一个小脚本来并行处理所有序列,意在进行比较:

文件1中的序列1和文件2中的序列1

文件1中的序列2和文件2中的序列2,依此类推。

然后最终将结果(是否匹配)返回给我,并给我%的身份。

每个序列都有一个关联的标头,以“>”表示,后跟样本名称。

file1
>Sample 1
ABCDEFG
>Sample 2
ZXCVBNM
>Sample 3
QAZWSXEDC
>Sample 4
ZXCVSDFGHNMJKL

file2
>Sample 1
ABCDEFG
>Sample 2
ZXCVBOM
>Sample 3
QAZWSXEDCF
>Sample 4
ASDFGHJK

我想生成一个表格,以以下格式显示结果:

Sample Name   Seq 1           Seq 2           Mismatch   % Identity
Sample 1      ABCDEFG         ABCDEFG         0          100
Sample 2      ZXCVBNM         ZXCVBOM         1          85.7
Sample 3      QAZRWSXED       QAZWSXEDCF      2          80
Sample 4      ZXCVSDFGHNMJKL  ASDFGHJK        6          42.9

我当时想这样做(在此处附加伪代码):

with open ('file1.txt', 'r') as infile1:
    sanger = infile1.read().splitlines()  # Read file1 in

with open ('file2.txt', 'r') as infile2:
    ngs = infile2.read().splitlines()   # Read file2 in

with open ('outfile.txt', 'w') as outfile:  # Write output file
    data_iter = iter(sequences)
    order = ['Sample Name', 'Seq 1', 'Seq 2', 'Mismatch', '% Identity']
    header = '\t'.join([k for k in order])
    outfile.write(header + '\n')   # Print the header information

    if sanger[1] in ngs[1]:
        locations = [[{'Sample Name': seq_name.strip('>'),
                       'Seq 1': sanger[1],
                       'Seq 2': ngs[1],
                       'Mismatch': mismatch count,
                       '% Identity': 100 - (mismatch count/len(sanger/ngs) * 100)}]]                        
        for loc in chain.from_iterable(locations):
            output = '\t'.join([str(loc[k]) for k in order])
            outfile.write(output + '\n')

并重复所有60个序列。

2 个答案:

答案 0 :(得分:0)

您可能不想打开两个文件,而是要打开它们并使用zip函数和包含文件的迭代器来遍历它们。这应该起作用:

$numbers = array(0 => "0", 1 => "1", 2 => "2", 3 => "3"); $letters = array(0 => "a", 1 => "b", 2 => "c", 3 => "d"); foreach(array_combine($numbers, $letters) as $n => $l){ echo "\${$l}[0] = array_keys(\$car_images[{$n}])<br>"; }

您的主要逻辑应该在一个可以计算比对和结果并返回输出字符串的函数中。

答案 1 :(得分:0)

我将回答您的主要问题,如何有效地处理两个文件。有关指标和构建表格的问题是分开的,应在单独的问题中处理。

  1. 打开文件。
  2. zip一起
  3. 将迭代器通过itertools.islice插入,步长为2。

演示:

$ cat file1.txt 
>Sample 1
ABCDEFG
>Sample 2
ZXCVBNM
>Sample 3
QAZWSXEDC
>Sample 4
ZXCVSDFGHNMJKL
$ cat file2.txt 
>Sample 1
ABCDEFG
>Sample 2
ZXCVBOM
>Sample 3
QAZWSXEDCF
>Sample 4
ASDFGHJK
$ python3
>>> from itertools import islice
>>> 
>>> with open('file1.txt') as f1, open('file2.txt') as f2:
...     pairs = islice(zip(f1, f2), 1, None, 2)
...     for pair in pairs:
...         print(pair)
... 
('ABCDEFG\n', 'ABCDEFG\n')
('ZXCVBNM\n', 'ZXCVBOM\n')
('QAZWSXEDC\n', 'QAZWSXEDCF\n')
('ZXCVSDFGHNMJKL\n', 'ASDFGHJK\n')

假设您使用的是Python 3,请在Python 2中使用zip,而不是https://mynextcloud.com/remote.php/webdav/path/to/folder/ ,以避免完全将两个文件读入内存。