我有一个具有以下结构的文件:
@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中一个更复杂的主题,我不知道,任何帮助和解释都会很棒,谢谢!
答案 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)
以下代码
+
或!
@
开头,则>
替换为@
码
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
,则只需在方括号之间添加它们。