nilsnilspils Skrevet 18. august 2011 Del Skrevet 18. august 2011 Hei forum! Jeg har fikla med en kodesnutt som henta ut informasjon fra en eller flere filer, og la det i en ny en. Nå har jeg lyst til å hente ut spesiell informasjon fra to steder i ei fil, med mindre linja i filen starter med en X. Jeg er ikke spesielt flink i python, og har stanget en del nå, får bare en dum feil, som sikkert er grunnet mye rart. Er det noen som kan gi en pekepinn på hva som er elementært galt her? import os import sys nfile='C:\py\tralala.txt' ##ut=open(nfile,'w') ##prev_ln='trt' ##prev_sp='0' for subdir, dirs, files in os.walk('.'): for file in files: fname=file.split('.')[0] ftype=file.split('.')[1] if ftype=='txt': f=open(file,'r') lines=f.xreadlines() modifiedfile=fname+'.txt' h=open(modifiedfile,'w') for line in lines: if not line.startswith('X'): print(line) try: linename=line[0:12] sp=line[26:35] se=line[36:46] line=sp+''+se+'\n' h.write(line) except IndexError: print " Not able to split" h.close f.close På forhånd tusen takk! Lenke til kommentar
snippsat Skrevet 18. august 2011 Del Skrevet 18. august 2011 Kan du eksempel på innhold i filen/filene og nøyaktig hva du ønsker og ta ut. Når dette er klart,kan jeg nok gi noen tips om søking og skrive til ny fil på en mere elegant måte. Nå ser det rotete ut. Lenke til kommentar
nilsnilspils Skrevet 18. august 2011 Forfatter Del Skrevet 18. august 2011 (endret) Fila er i all korthet bygd opp slik: X bla bla bla X bla bla bla X bla bla bla X bla bla bla X bla bla bla X bla bla bla X bla bla bla A 509213750293521052059720359273502 A 209572305972150972305972059725205 A 215393215092175092173520195701957 A 123941592309527530972095720957257 A 952932542095782539826399844442234 Altså, jeg vil hoppe over alt som begynner med X, og heller ta alt annet i fila. X inneholder metadata, og er uinteressant. Alt under headeren er hva jeg vil ha. Fra informasjonen der, vil jeg kun hente ut tallene mellom posisjon 26 og 35, og mellom posisjon 36 og 46. Deretter vil jeg ha dette som to kolonner (som de forøvrig ligger i originalen også), inn i en output fil. Håper det ble litt lettere nå. Kan du i tillegg anbefale en nybegynnerbok i Python jeg kunne ha bestilt? På forhånd takk! Endret 18. august 2011 av nilsnilspils Lenke til kommentar
snippsat Skrevet 18. august 2011 Del Skrevet 18. august 2011 (endret) kun hente ut tallene mellom posisjon 26 og 35, og mellom posisjon 36 og 46. Deretter vil jeg ha dette som to kolonner (som de forøvrig ligger i originalen også), inn i en output fil. Skal alle tallene slås sammen? Fordi 36 og 46 vil ikke virke viss du leser line for line. Som du ser er lengenden på 35 >>> s = 'A 509213750293521052059720359273502' >>> len(s) 35 >>> s = 'A 509213750293521052059720359273502'[26:35] >>> s '359273502' >>> s = 'A 509213750293521052059720359273502'[36:46] >>> s '' Viss jeg slår sammen alle tallene. with open('num.txt') as f: num = [c for c in f.read() if c.isdigit()] #print ''.join(num)[24:33] #359273502 print ''.join(num)[34:44] #095723059721 Ikke tenk på koden den kan jeg forklarer senere,det jeg lurer på er tallet 0957230597 som slices ut med [34:44]? Som er [36:46] i koden din. Endret 18. august 2011 av SNIPPSAT Lenke til kommentar
nilsnilspils Skrevet 19. august 2011 Forfatter Del Skrevet 19. august 2011 Hei, unnskyld! Lagde en dårlig kopi av det jeg holder på med, lengden er egentlig mye lenger, rundt 70 karakterer langt. Så vennligst bare se bort fra at jeg lagde så kort eksempelfil. Poenget er at det er en del informasjon i filen som står tett i tett etterhverandre, men det er kun det mellom 26 og 35, og 36 og 46 som er av interesse. Tallene skal helst bare stå som to kolonner i den nye fila, altså med et mellomrom mellom kolonnene. Håper jeg forklarte det sånn tålelig, setter veldig pris på hjelpen! Lenke til kommentar
snippsat Skrevet 19. august 2011 Del Skrevet 19. august 2011 (endret) Forlenger som dette. A 5092137502935210520597203592735021111111111111111 A 2095723059721509723059720597252052222222222222222 with open('num.txt') as f: with open('new.txt', 'w') as f_out: for line in f: if line.startswith('A'): sp = line[26:35] se = line[36:46] #print '%s %s' % (sp,se) f_out.write('%s %s\n' % (sp,se)) Output. 359273502 1111111111 059725205 2222222222 195701957 3333333333 720957257 4444444444 844442234 5555555555 Litt om koden jeg bruker with open(),da slipper man og lukke file objektet. Jeg regner med at alle linjer starter med A. Ser at i første koden at du prøver og gjøre et søk ettet fil/filene først. Dette er noe du kansje må forklare bedere. Endret 19. august 2011 av SNIPPSAT Lenke til kommentar
nilsnilspils Skrevet 22. august 2011 Forfatter Del Skrevet 22. august 2011 Flott! Tusen takk, fungerer ypperlig nå! Det at jeg prøver å gjøre et søk etter fil/filene først, kan jeg desverre ikke forklare. Dette var et kopi/lim prosjekt jeg begikk meg ut på, da jeg ikke akkurat behersker Python godt. Hadde du en bok om Python å anbefale? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå