在python中打印两个模式之间的行

时间:2015-08-03 12:05:33

标签: python file-io

我有一个具有以下结构的文件:

@scaffold456
ATGTCGTGTCAGTG
GTACGTGTGTGG
+
!!!!!@!!!!!!!!
!!!!!!!!!!!!
@scaffold342
ATGGTGTCGTGGTG
ACGTGGC
+
!>!>!!!!+!!!!!
!!!!!!!

我想要一个像这样的输出:

>scaffold456
ATGTCGTGTCAGTG
GTACGTGTGTGG
>scaffold342
ATGGTGTCGTGGTG
ACGTGGC

我想在Python中实现这一点,我从以下开始:

fastq_filename = "test_file"
fastq = open(fastq_filename) # fastq is the file object

for line in fastq:
    if line.startswith("@"):
        print line.replace("@", ">")

但我不能继续,因为我不知道: 1.如何在某种模式匹配后打印线条? 2.我应该如何指定我想跳过+到下一个@符号之间的行?

这是Python中一个更复杂的主题,我不知道,任何帮助和解释都会很棒,谢谢!

6 个答案:

答案 0 :(得分:4)

fastq_filename = "test_file"
fastq = open(fastq_filename) # fastq is the file object    

canPrintLines = False # Boolean state variable to keep track of whether we want to be printing lines or not
for line in fastq:
    if line.startswith("@"):
        canPrintLines = True # We have found an @ so we can start printing lines
        line = line.replace("@", ">")
    elif line.startswith("+"):
        canPrintLines = False # We have found a + so we don't want to print anymore

    if canPrintLines:
        print(line)

答案 1 :(得分:2)

我不知道您与+的行有多复杂。我理解您的问题,因此您希望忽略这些行中的所有@interesting_line=True for line in fastq: if line.strip()=='+': # Here we check for the + sign. You might need to adapt the test. interesting_line=False # We don't care from now on if line.startswith('@'): interesting_line=True if interesting_line: # Do what you want with your line. 符号。

在这种情况下,我会引入一个状态变量来存储我们当前是否正在处理一个有趣的行:

Intent intent = new Intent(Intent.ACTION_EDIT);
                intent.setType("vnd.android.cursor.item/event");
                intent.putExtra("beginTime", cal.getTimeInMillis());
                intent.putExtra("allDay", true);
                intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
                intent.putExtra("title", title);
                intent.putExtra("description",desc);
                c.startActivity(intent);

正如我所说,您可能需要检查是否存在我的简单测试不匹配的情况,但这应该为您提供一个起点

答案 2 :(得分:1)

这是一种简单的方法:

for line in fastq:
    if line and line[0].isalpha() or line[0]== '@':
        line = line.rstrip()
        print line.replace("@", ">")

输出:

>scaffold456
ATGTCGTGTCAGTG
GTACGTGTGTGG
>scaffold342
ATGGTGTCGTGGTG
ACGTGGC

答案 3 :(得分:1)

for line in fastq:
    if line.startswith("@") or line.isalpha():
        print(line.replace("@", ">"))

找到以@开头的行,将其替换为>并打印出来。 然后找到一个只包含字母的行,然后打印该行。

答案 4 :(得分:0)

以下代码

  1. 忽略行以+!
  2. 开头 如果行以@ 开头,则
  3. >替换为@
  4. 写下所有其他行
  5.   

    def format_file(path):
        new_lines = ""
        for line in open(path):
            if line.startswith("@"):
                new_lines += line.replace("@", ">")
            elif line.startswith("+"):
                pass
            elif line.startswith("!"):
                pass
            else:
                new_lines += line
        print new_lines
    
    format_file("test_file")
    

答案 5 :(得分:0)

如果我正确地解释你的问题,那么我认为这就是你要找的东西

for line in fastq:
    line = line.replace('\n','')
    n = len(line)
    mat = re.match(r'([ATGC]){%d}' % n,line)
    if mat:
        print line
    if line[0] == '@':
        print line.replace('@','>')

这使用Regular Expressions非常有用。这表示如果它只是一行A,T,G, or C那么打印该行,然后另一个if语句与你拥有的相同。 {%d}匹配前一个语句n的出现次数[ATGC]。如果超过A,T,G, or C,则只需在方括号之间添加它们。