Grosse Textdateien schnell editieren

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.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Beitragvon helduel » Mittwoch 3. Dezember 2008, 17:52

maxsz hat geschrieben:Die Frage ist nun, gibt es eine Möglichkeit nur diese Zeilen direkt in der Datei zu ersetzen, ohne den Rest beachten zu müssen?

Ja, in Deinem Fall schon, da immer 13 Zeichen durch 13 andere ersetzt werden. In etwa so:

Code: Alles auswählen

test = open("/tmp/foo", "r+")
SEARCH = '0.000000E+00'
line = test.readline()
while line:
    if line[-13:].startswith(SEARCH):
        test.seek(test.tell() - 13)
        test.write('1.234567E+00\n')
    line = test.readline()
test.close()


Gruß,
Manuel
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Beitragvon helduel » Mittwoch 3. Dezember 2008, 17:59

Siggi2008 hat geschrieben:Der Block ist nur ein Auszug.

Der Block hat aber nicht viel mit deinem Code zu tun. Du splitest nach "STRESSES IN.*IN ELEMENT\s+\d+, POINT\s+\d+", aber in deinem Beispiel kommt sowas gar nicht vor.

So wie ich das sehe, reicht es, wenn du schaust, ob die Zeile mit "FIB. STRESS" beginnt (line.startswith("FIB")), oder auch nur mit "FIB". Dann kannst du entsprechend reagieren.

Aber durch die Datei durchjagen und eine andere schreiben - da musst du durch ;-). Interessant wäre jetzt, wie du die Zeilen parst und neu sortierst. Da ist, denke ich, mehr Spielraum für Optimierungen.
maxsz
User
Beiträge: 2
Registriert: Mittwoch 3. Dezember 2008, 16:05

Beitragvon maxsz » Mittwoch 3. Dezember 2008, 21:21

Also das hat schon einiges gebracht. Vielen Dank!

Also immer zwei Blöcke zwischen "STRESSES..." gehören zusammen. Aber vlt sagt der Code mehr als tausend Worte. Eventuell sind ja noch weitere Optimierungen möglich...


Code: Alles auswählen

def sort_fibres(string1, string2):
   predicate = re.compile('-?\d+\.\d+')
   elem_list1 = predicate.findall(string1)
   elem_list2 = predicate.findall(string2)
   
   # Create new list
   beam_list = []
   
   for i in range(0, len(elem_list1)):
      beam_list.append([i+1,
                   elem_list1[i],
                   elem_list2[i],
                   calculate_mean(float(elem_list1[i]), float(elem_list2[i]))])
      
   return beam_list


def write_beam_elems(filestring, elems, output_filename):
   # Generate the correct filename from output_filename
   output_fn = os.path.splitext(output_filename)[0]
   output_file_extension = os.path.splitext(output_filename)[1]
   
   # Split the *.out file
   predicate = re.compile('STRESSES IN.*IN BEAM ELEMENT\s+\d+, POINT\s+\d+')
   elem_list = predicate.split(filestring)
   
   i = 1
   j = 1
   length = (len(elem_list)-1)/2
   while i <= len(elem_list)-2:   
      try:
         beam_list = sort_fibres(elem_list[i], elem_list[i+1])
         filename = "%s%i%s" % (output_fn, j, output_file_extension)
         f = open(filename, "w")
         f.write(beam_list2str(beam_list))
         f.close()
         tem_output_filename = "%s%i.%s" % (output_fn, j, 'tem')
         create_tem(tem_output_filename, elems[j-1], beam_list)
         
         print_status(j, length)
         
         i += 2
         j += 1
      except IOError:
         print "Error opening file %s. Does the path '%s/' exist?" % (filename, output_fn)
         break

derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Mittwoch 3. Dezember 2008, 22:22

Aus Zeile 7-16 kannst du eine Zeile machen (List Comprehension). Aus

Code: Alles auswählen

    # Create new list
    beam_list = []
   
    for i in range(0, len(elem_list1)):
        beam_list.append([i+1,
                         elem_list1[i],
                         elem_list2[i],
                         calculate_mean(float(elem_list1[i]), float(elem_list2[i]))])
       
    return beam_list
wird (ungetestet)

Code: Alles auswählen

beam_list = [[index+1,
              elem_list1[index],
              elem_list2[index],
              calculate_mean(float(elem_list1[i]),
                             float(elem_list2[i]))] for index, value in  enumerate(elem_list1)]

  • with-statement einsetzen
  • sinnvolle Variablen benutzen
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Donnerstag 4. Dezember 2008, 15:04

SchneiderWeisse hat geschrieben:Hat zwar nichts mit deinem Problem direkt zu tun, aber für was ist das verschachtelte try-Konstrukt?

FYI: Die gemeinsame Benutzung von `except` und `finally` ist IIRC erst ab einer bestimmten Python-Version (2.4? 2.5?) möglich.

Im vorliegenden Fall hätte ich es anders herum verschachtelt, *wenn* ich nicht sowieso `with` benutzen würde.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder