Es gibt Zeiten, in denen Sie eine große Anzahl von Sequenzen zufällig abtasten möchten. Dieses Mal werde ich den Code vorstellen, der in einem solchen Fall verwendet werden soll.
Die Methode besteht einfach darin, die Datei zu öffnen, ein Array mit Zufallszahlen auszuwählen und darauf zuzugreifen.
Zugriff durch Auswahl eines Arrays mit Zufallszahlen
#Array abrufen
seqnum=random.randint(1,seqnumMAX)
name = linecache.getline(infn, seqnum*2-1) #Sequenzname
seq = linecache.getline(infn, seqnum*2) #Array
#Schreiben
outfdl = open(outfn, 'w')
outfdl.writelines(name+seq)
outfdl.close()
linecache.clearcache() #Cache leeren
Verwenden Sie zu diesem Zeitpunkt `linecache.getline (Name der Eingabedatei, Anzahl der Zeilen)`
`zum Lesen.
Dadurch wird das Lesen der angegebenen Zeile intern optimiert.
Bioinformatik neigt dazu, große Sequenzdateien zu verarbeiten, was nützlich sein kann.
Die zufällige Wiederherstellungsextraktion kann durchgeführt werden, indem so oft eine Schleife ausgeführt wird, wie Sie diesen Prozess erfassen möchten.
Das Obige kann wie folgt als geeigneter Prozess zusammengefasst werden.
randsampleFasta.py
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
"""
Stellen Sie ein Array nach dem Zufallsprinzip wieder her und extrahieren Sie es aus einer Fasta-Datei.
"""
__author__ = "Kazuki Nakamae <[email protected]>"
__version__ = "0.00"
__date__ = "29 May 2017"
import sys
import mmap
import linecache
import random
def randsampleFasta(infn,outfn,n):
"""
Stellen Sie ein Array nach dem Zufallsprinzip wieder her und extrahieren Sie es aus einer Fasta-Datei.
@param infn fasta Dateiname zu lesen{string}
@param outfn gibt den Namen der Fasta-Datei aus{string}
@param n Anzahl der Arrays, die wiederhergestellt und extrahiert werden sollen{int}
"""
infdl = open(infn, 'r')
#Überprüfen Sie die Anzahl der Sequenzen in der Eingabedatei
print('Checking how many sequences are in a FASTA format sequence file....(1/2)')
buf = mmap.mmap(infdl.fileno(), 0, prot=mmap.PROT_READ)
seqnumMAX= 0
readline = buf.readline
while readline():
seqnumMAX += 1
seqnumMAX = int(seqnumMAX / 2)
infdl.close()
print(str(seqnumMAX)+' sequences')
#Zufällige Wiederherstellung und Extraktion von Sequenzen
print('random sampling from a sequence with replacement....(2/2)')
outfdl = open(outfn, 'w')
random.seed(a='hoge', version=2) #Sameneinstellung
seqi=1
while seqi<=n:
seqnum=random.randint(1,seqnumMAX)
name = linecache.getline(infn, seqnum*2-1)
seq = linecache.getline(infn, seqnum*2)
outfdl.writelines(name+seq)
seqi += 1
outfdl.close()
linecache.clearcache()
print('done.')
if __name__ == '__main__':
argvs = sys.argv #Kommandozeilenargumente
argc = len(argvs) #Anzahl der Argumente
if (argc != 4): #Argumentprüfung
print("USAGE : python3 randsampleFasta.py <INPUT.fa> <OUTPUT.fa> <NUMBER_OF_SEQUENCES>")
quit()
randsampleFasta(argvs[1],argvs[2],int(argvs[3]))
quit()
Datei zum Eingeben
test.fa
>1
CCGTATTGGAAAGCTC
>2
AGGATTATCGGATACT
>3
ATCCGGACGGGGGGTT
>4
GACCTCGTTATCATCC
>5
AGTCAGGTTACCCGCA
Eingabe auf Bash
Eingang
python3 randsampleFasta.py test.fa out.fa 4
Ausgabe auf Bash
Standardausgabe
Checking how many sequences are in a FASTA format sequence file....(1/2)
5 sequences
random sampling from a sequence with replacement....(2/2)
done.
Ausgabedatei
out.fa
>3
ATCCGGACGGGGGGTT
>2
AGGATTATCGGATACT
>4
GACCTCGTTATCATCC
>3
ATCCGGACGGGGGGTT
Du bist frei.
Recommended Posts