#!/usr/bin/env python ''' mtoldtonew ---------- This script uses mtoldtonew.csv to convert node names in "we" schem file(s). The destination filename(s) are generated automatically. Each will have "new" instead of "old" if the original file had "old" in the name. Otherwise, it will have "new" added to the beginning of the name. Usage: python3 mtoldtonew.py or python3 mtoldtonew.py Examples: python3 mtoldtonew.py palm_oldnodes.we python3 mtoldtonew.py palm_oldnodes.we palm.we * Example 2 yields: palm_newnodes.we and newpalm.we with all nodes replaced according to csv. (adds "new" to beginning if "old" is not in specified filename) * only replaces node names surrounded by quotes - you can change that behavior using python: from mtoldtonew import oldToNew oldToNew('file.we', quotechar='') edit '%s' as needed (old name in column 1, new name in 2) ''' from __future__ import print_function import os import csv import sys mtdeltas_csv = "mtoldtonew.csv" if not os.path.isfile(mtdeltas_csv): print("ERROR: missing " + mtdeltas_csv) # exit(1) files = [] def usage(): print(__doc__) mtdeltas = {} def stripQuotes(s, quotechar='"'): if (len(s) >= 2) and (s[0] == quotechar) and (s[-1] == quotechar): s = s[1:-1] return s def quoted(str1, quotechar='"'): return(quotechar + str1 + quotechar) def replaceQuoted(str1, deltas, quotechar='"'): ret = str1 for k, v in deltas.items(): ret = ret.replace(quoted(k, quotechar), quoted(v, quotechar)) return ret with open(mtdeltas_csv) as csvfile: ins = csv.reader(csvfile, delimiter=',', quotechar='"') lineI = 0 for row in ins: lineI += 1 if (len(row) < 2): continue oldStr = stripQuotes(row[0].strip()) newStr = stripQuotes(row[1].strip()) # csv doesn't strip quotes if a space is before an opening quote # print("'%s', '%s'" % (oldStr, newStr)) if len(oldStr) > 0: if len(newStr) > 0: mtdeltas[oldStr] = newStr else: print("Skipped empty destination for '" + oldStr + " on line " + str(lineI) + " in " + csvfile) def oldToNew(path, quotechar='"'): newName = path.replace("old", "new") if newName == path: newName = "new" + newName if os.path.exists(newName): print("WARNING: Overwriting '%s'..." % newName) with open(path, 'r') as ins: with open(newName, 'w') as outs: oldLine = True while oldLine: oldLine = ins.readline() if oldLine: outs.write(replaceQuoted(oldLine, mtdeltas) + "\n") print("* wrote '%s'" % newName) def main(): for i in range(1, len(sys.argv)): try_path = sys.argv[i] if os.path.isfile(try_path): files.append(try_path) else: print("MISSING file: '" + try_path + "'") return 1 if len(files) < 1: usage() print("") print("You must specify a plain-text schem such as a\n" ".we file, or any file containing double-quoted node names.") return 2 for oldName in files: print("Processing %s..." % oldName) oldToNew(oldName) return 0 if __name__ == "__main__": sys.exit(main())