Seite 1 von 1

Verfasst: Mittwoch 3. Dezember 2008, 17:52
von helduel
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

Verfasst: Mittwoch 3. Dezember 2008, 17:59
von helduel
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.

Verfasst: Mittwoch 3. Dezember 2008, 21:21
von maxsz
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


Verfasst: Mittwoch 3. Dezember 2008, 22:22
von derdon
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

Verfasst: Donnerstag 4. Dezember 2008, 15:04
von Y0Gi
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.