Gå til innhold

[Løst] [Python] Hente ut informasjon fra en fil. Veldig nybegynner!


Anbefalte innlegg

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
Videoannonse
Annonse

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 av nilsnilspils
Lenke til kommentar
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 av SNIPPSAT
Lenke til kommentar

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

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 av SNIPPSAT
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...