######################################################################## import os import re import time import csv from operator import floordiv folderLocation = "x:\folderlocation\Models" listSubFolders = os.listdir(folderLocation) flowChangeLocationsTable = [] streamGeometry = {} for subFolder in listSubFolders: subFolderPath = folderLocation + "\\" + subFolder if os.path.isdir(subFolderPath): listSubFolderFiles = os.listdir(subFolderPath) for file in listSubFolderFiles: #Geometry files in hecras have a ".g0*" extension, the code below filters to look that geometry files only if file.find(".g") != -1: openFile = open(subFolderPath + "\\" + file, "r") readFile= openFile.read() pattern1 = re.compile(r"Type RM Length L Ch R =.+\n") pattern2 = re.compile("(?<=\n#Mann=).+(?![A-z]+)") pattern3 = re.compile(r"(?<=Type RM Length L Ch R .+(\d+)") manningsCoeff = pattern2.finditer(readFile) stations = pattern3.finditer(readFile) stationsList = [] for station in stations: if int(station.group().split(",")[0].strip()) == 1: stationsList.append(station.group().split()) manningsCoeffList = [] for coeffs in manningsCoeff: numberOfIter = floordiv(int(coeffs.group().split(",")[0])-1, 3) + 1 newStartLocation = coeffs.start() + readFile[coeffs.start():].find("\n") + 1 TempList = [] while numberOfIter > 0: line = readFile[newStartLocation:newStartLocation + readFile[newStartLocation:].find("\n")] newStartLocation = newStartLocation + readFile[newStartLocation:].find("\n") + 1 numberOfIter = numberOfIter - 1 for item in line.split(): TempList.append(item) manningsCoeffList.append(TempList) streamGeometryData = map(list.__add__,stationsList,manningsCoeffList) streamGeometry[file] = streamGeometryData outputCheckMannings = csv.writer(open(folderLocation + "\\" +'streamGeometry'+ str(time.gmtime().tm_sec) + '.csv', 'wb')) list = [] for key,value in streamGeometry.items(): temp = [] for i in range(len(value)): temp1 = [] temp1.append(key) for item in value: temp1.append(item) temp.append(temp1) for items in temp: finalRow = [] for item in items: for i in item.split(","): finalRow.append(i) outputCheckMannings.writerow(finalRow)
Update: Had sort of an epiphany the other day and noticed that if you changed the prj, geometry, flow, or plan files to a text file then they are perfectly legible to read in as input cards. Never really thought it about like this, but I guess that's how the HEC-RAS program works. Probably just reads in these input cards, and searches for keywords to store the appropriate input values in the right variables.Reading input lines from a text file and storing info in different variables when keywords are flagged isn't difficult. But the shear amount of different keywords and variables is crazy I feel. With this is in mind, I emailed the ACOE to see if I could get their source code for reading the input files only. No response yet. It also crossed my mind that maybe I could file a request under the Freedom of Information Act. I don't think I'd be able to get the "brains" of the HEC-RAS program, but I feel receiving code that reads the input files and stores it into its separate variables would be game.
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.