Springen naar inhoud

Programmeren in python


  • Log in om te kunnen reageren

#1

Parfum

    Parfum


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 08 december 2010 - 15:52

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.

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

Veranderd door jhnbk, 08 december 2010 - 16:31
code tags ipv quote tags


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 08 december 2010 - 16:27

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.

#3

Parfum

    Parfum


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 08 december 2010 - 17:09

Bijvoorbeeld (sequenctie even gedubliceerd anders word het te lang)
>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
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.

Veranderd door Parfum, 08 december 2010 - 17:12


#4

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 08 december 2010 - 17:32

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:

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.

#5

Parfum

    Parfum


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 08 december 2010 - 17:57

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:

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:)

#6

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 08 december 2010 - 18:06

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.

#7

Parfum

    Parfum


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 08 december 2010 - 19:42

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.

#8

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 09 december 2010 - 20:02

seq is een dictionary. Lengte van een sequentie kan dan als volgt:
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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures