Datei in Speicher speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mit
User
Beiträge: 279
Registriert: Dienstag 16. September 2008, 10:00

Freitag 25. Februar 2011, 08:33

Hallo,
I rede jeweils 4 Zeilen gleichzeitig ein und als naechstes erstelle ich ein String line2_4 aus line2 und line4. line2_4 und line1 moechte ich in Speicher behalten, weil ich diese Datei mehrmals durchsuchen muss.

Code: Alles auswählen

A_fh = open(sys.argv[1]) 

while(True):
  line1 = A_fh.readline().rstrip()
  line2 = A_fh.readline().rstrip()
  line3 = A_fh.readline().rstrip()
  line4 = A_fh.readline().rstrip()

  line2_4 = line2 + line4

  #speichern in memory line1 und line2_4
  
while(True):
  line1 = von_memory.readline()
  line2 = von_memory.readline()

  if (line2.find("match") >= 0)

Ich hoffe, dass ich dadurch bessere Geschwindigkeit erhalte als immer wieder von der Datei zu reden.

Wie kann man dieses Problem am besten loesen?

Vielen Dank in voraus.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 25. Februar 2011, 09:13

Warum packst du die Zeilen im ersten Duchlauf nicht in eine Liste?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mit
User
Beiträge: 279
Registriert: Dienstag 16. September 2008, 10:00

Samstag 26. Februar 2011, 11:48

Ich habe die komplette Datei wie folgt ins Speicher eingelesen:

Code: Alles auswählen

import sys 
A_fh = open(sys.argv[1]) 
print "Input file name: " + sys.argv[1]

output_fh = open(sys.argv[3], 'w')

entireFile = []

while(True):
  line1 = A_fh.readline().rstrip()
  line2 = A_fh.readline().rstrip()
  line3 = A_fh.readline().rstrip()
  line4 = A_fh.readline().rstrip()
  if not line1:
    break  
  entireFile.append(line1)
  entireFile.append(line2 + (10 * '+') + line4)
  
print entireFile

while(True):
  line1 = entireFile.readline()
  line2 = entireFile.readline()

  if (line2.find("+++") >= 0):
    output_fh.write(line1 + '\n')
    output_fh.write(line2 + '\n')


Als output bekomme ich

Code: Alles auswählen

['1111111111111', '2222222222222NNNNNNNNNN4444444444444', '5111111111111', '6222222222222NNNNNNNNNN8444444444444']
Dies ist die Eingabedatei

Code: Alles auswählen

1111111111111
2222222222222
3333333333333
4444444444444
5111111111111
6222222222222
7333333333333
8444444444444
Gibt es etwas aehnliches wie readline fuer listen oder ein anderen weg wie man jeweils zwei Elemente aus der Liste lesen kann?

Vielen Dank im Vorraus.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Samstag 26. Februar 2011, 12:28

Code: Alles auswählen

it = iter(mylist)

while True:
    line1 = it.next()
    line2 = it.next()
Dann noch die StopIteration-Ausnahme abfangen. :)

Was ich mich aber frage: Brauchst du wirklich zwei Schleifen? Auf dem ersten Blick sieht es naemlich so aus, als koenntest du das alles in einer Schleife erledigen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mit
User
Beiträge: 279
Registriert: Dienstag 16. September 2008, 10:00

Samstag 26. Februar 2011, 15:00

Danke, aber wie macht man eine StopIteration-Ausnahme? Denn momentan bekomme ich Error mit den folgenden Code:

Code: Alles auswählen

import sys 

A_fh = open(sys.argv[1]) 
print "Input file name: " + sys.argv[1]

output_fh = open(sys.argv[3], 'w')

def searchMatch(matchStr, fileList, outputFile):
  it = iter(fileList)
  while(True):
    line1 = it.next()
    line2 = it.next()
    
    print line1, line2
    if (line2.find(matchStr) >= 0):
      print "Hit"
      outputFile.write(line1 + '\n')
      outputFile.write(line2 + '\n')


entireFile = []

while(True):
  line1 = A_fh.readline().rstrip()
  line2 = A_fh.readline().rstrip()
  line3 = A_fh.readline().rstrip()
  line4 = A_fh.readline().rstrip()
  if not line1:
    break  
  entireFile.append(line1)
  entireFile.append(line2 + "+" + line4)
  
print entireFile

searchMatch("6", entireFile, output_fh)
searchMatch("2", entireFile, output_fh)

Code: Alles auswählen

Input file name: test/test.txt
['1111111111111', '2222222222222+4444444444444', '5111111111111', '6222222222222+8444444444444']
1111111111111 2222222222222+4444444444444
5111111111111 6222222222222+8444444444444
Hit
Traceback (most recent call last):
  File "findKmer.py", line 38, in <module>
    searchMatch("6", entireFile, output_fh)
  File "findKmer.py", line 14, in searchMatch
    line1 = it.next()
StopIteration
P.S. Ich brauche zwei Schleifen, da ich viele vergleiche durch fuehren muss.
Zuletzt geändert von mit am Samstag 26. Februar 2011, 15:21, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Samstag 26. Februar 2011, 15:08

Du sollst die Ausnahme abfangen, nicht "machen". Wie das geht steht in jedem Tutorial... :roll:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mit
User
Beiträge: 279
Registriert: Dienstag 16. September 2008, 10:00

Samstag 26. Februar 2011, 15:54

Koenntest du mir bitte den Link zu schicken wie man es schreibt, da ich nichts finden kann.
mit
User
Beiträge: 279
Registriert: Dienstag 16. September 2008, 10:00

Sonntag 27. Februar 2011, 01:52

Danke, die Loesung sieht wie folgt aus:

Code: Alles auswählen

def searchMatch(matchStr, fileList, outputFile):
  it = iter(fileList)
  try:
    while(True):
      line1 = it.next()
      line2 = it.next()
     
      print line1, line2
      if (line2.find(matchStr) >= 0):
        print "Hit"
        outputFile.write(line1 + '\n')
        outputFile.write(line2 + '\n')
  except StopIteration:
    pass
BlackJack

Sonntag 27. Februar 2011, 09:14

@mit: In Python braucht man keine Klammern um Bedingungen bei ``while`` oder ``if``. Und das `find()` lässt sich kürzer und auch einfacher verständlich mit dem ``in``-Operator ausdrücken.

Ich würde ausserdem `itertools.izip()` verwenden, dann wird es auch noch mal etwas übersichtlicher (ungetestet):

Code: Alles auswählen

from itertools import izip


def search_match(needle, lines, out_file):
    line_it = iter(lines)
    for line_a, line_b in izip(line_it, line_it):
        if needle in line_b:
            out_file.write(line_a + '\n')
            out_file.write(line_b + '\n')
So ein bisschen stellt sich mir aber auch die Frage ob das hier überhaupt notwendig ist bei jedem Itertieren zwei aufeinanderfolgende Elemente zusammen zu fassen. Wenn man keine Schleifen über die Einzelelemente benötigt und die beiden zu einem "Datensatz" gehören, dann sollte man die vielleicht auch gleich beim Einlesen in einer Datenstruktur vereinen. Und wenn es so etwas simples wie ein `tuple` ist.
Antworten