Programmeren in python

Moderators: jkien, Xilvo

Reageer
Berichten: 4

Programmeren in python

Ik probeer een nogal groot bestand af te lezen en daarin het aantal voorkomens van a te tellen. Het is een fastabestand waarin elke dnaseq met '>' begint.

Daartoe onderstaande geschreven prog.. Simpel zou je denken maar ik krijg daardoor de dnasequencties die volgen na '>' niet alleen ermee in 1 lijst maar het aantal voorkomens van 'a' of eender welke ander letter kunnen niet meer geteld worden.Ik zie zo gauw niet waar de fout precies zit.

Code: Selecteer alles

def read_f(seq):

 l=[]

 r=[]

for line in seq:

if line[0]=='>':

l.append(line.rstrip())

else:

r.append(line.rstrip())

  m=l.count('a')

   return m

Gebruikersavatar
Berichten: 6.905

Re: Programmeren in python

Kan je een voorbeeld geven van zo'n bestand? (Plaats enkele lijnen hier tussen code tags bijvoorbeeld)
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Berichten: 4

Re: Programmeren in python

Bijvoorbeeld (sequenctie even gedubliceerd anders word het te lang)

Code: Selecteer alles

>AF001437 AF001437.1 09-OCT-2006

ggcacgagatggcggcctcctggaggctgggctgtgatccgcggctgctgcgttatcttg

tgggcttccctggctgccgaagcgtagggctggtgaagggggctcttgggtggtccgtaa

gccgcggagctaattggagatggtttcacagcacgcagtggcttcggggtgatcccatta

agatactaatgccatcactgtctcctacaatggaagaaggaaacattgtgaaatggctga

>AF001437 AF001437.1 09-OCT-2006

ggcacgagatggcggcctcctggaggctgggctgtgatccgcggctgctgcgttatcttg

tgggcttccctggctgccgaagcgtagggctggtgaagggggctcttgggtggtccgtaa

gccgcggagctaattggagatggtttcacagcacgcagtggcttcggggtgatcccatta

agatactaatgccatcactgtctcctacaatggaagaaggaaacattgtgaaatggctga
Na een witregel volgt een nieuwe sequenctie die weer begint met >, ik probeer ze in een lijst te stopppen per sequenctie dus elke regel die begint met >. Het lukt alleen niet niet omdat de code blijkbaar een lijn opvat als 1 zin na een spatie.

dus dan krijg je per lijst

Code: Selecteer alles

ggcacgagatggcggcctcctggaggctgggctgtgatccgcggctgctgcgttatcttg
Niet de bedoeling omdat ik wil dat hij doorloopt tot de nieuwe seq die begint met >.Ook is het me niet duidelijk waarom count dan niet werkt ik krijg dan 0 als response.

Gebruikersavatar
Berichten: 6.905

Re: Programmeren in python

Code: Selecteer alles

from re import findall

f=open('dna.txt')

#dna bevat een kopie van het bestand

dna=""

for line in f.readlines():

dna+=line

f.close()

temp=findall(">[^>]*",dna) #lijst van alle strings die voldoen aan de regex

seq={}

for i in temp:

#elke gevonden sequentie toevoegen aan een

# dictionary met als key de naam en als value de sequentie

seq[findall(">.*\\n",i)[0]]=i.replace(findall(">.*\\n",i)[0],"")
Het zou zo kunnen (noot: re is trager dan gewone string operaties). Nu kan je door de dictionary lopen en de A's tellen.

Edit: er van uitgaande dat de lijn met > altijd verschillend is, anders worden er waarden overschreven.

Nu kan je als volgt doen:

Code: Selecteer alles

for key in seq.keys():

print seq[key].count('a')
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Berichten: 4

Re: Programmeren in python

jhnbk schreef:

Code: Selecteer alles

from re import findall

f=open('dna.txt')

#dna bevat een kopie van het bestand

dna=""

for line in f.readlines():

dna+=line

f.close()

temp=findall(">[^>]*",dna) #lijst van alle strings die voldoen aan de regex

seq={}

for i in temp:

#elke gevonden sequentie toevoegen aan een

# dictionary met als key de naam en als value de sequentie

seq[findall(">.*\\n",i)[0]]=i.replace(findall(">.*\\n",i)[0],"")
Het zou zo kunnen (noot: re is trager dan gewone string operaties). Nu kan je door de dictionary lopen en de A's tellen.

Edit: er van uitgaande dat de lijn met > altijd verschillend is, anders worden er waarden overschreven.

Nu kan je als volgt doen:

Code: Selecteer alles

for key in seq.keys():

print seq[key].count('a')
Je hebt gelijk dit werkt veel beter (verloopt soepel). Heel erg bedankt voor je hulp nu kan ik weer verder met de rest van mijn opdracht:)

Gebruikersavatar
Berichten: 6.905

Re: Programmeren in python

Graag gedaan. Nogmaals, als je veel dna sequenties moet parsen zal een constructie zonder reguliere uitdrukkingen eenvoudiger zijn. (Ik deed dit hier omdat het eenvoudigste is)
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Berichten: 4

Re: Programmeren in python

Ik ben nog niet zo thuis in python zoals je kunt merken dus ik ga voor zo eenvoudig mogelijk.

Ik zat nog over 1 ding na te denken, ik wil de ratio van het aantal voorkomens in elke sequenctie berekenen en dan plotten. Ik weet alleen nog niet hoe ik dit het best kan aanpakken. Met de voorgaande code weet ik niet hoe de lengte van sequenctie moet berekenen, een len(seq..) code pakt hij niet. Plotten is geen probleem, sorteren van data in een lijst kom ik niet echt uit.

Gebruikersavatar
Berichten: 6.905

Re: Programmeren in python

seq is een dictionary. Lengte van een sequentie kan dan als volgt:

Code: Selecteer alles

len(seq['>AF001437 AF001437.1 09-OCT-2006'])
Let wel op want er kunnen nog andere dingen als g t a en c in staan. (\n bijvoorbeeld)

Plotten kan met matplotlib op eenvoudige wijze.
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Reageer