1#! /usr/bin/env python3 2 3"Replace tabs with spaces in argument files. Print names of changed files." 4 5import os 6import sys 7import getopt 8import tokenize 9 10def main(): 11 tabsize = 8 12 try: 13 opts, args = getopt.getopt(sys.argv[1:], "t:") 14 if not args: 15 raise getopt.error("At least one file argument required") 16 except getopt.error as msg: 17 print(msg) 18 print("usage:", sys.argv[0], "[-t tabwidth] file ...") 19 return 20 for optname, optvalue in opts: 21 if optname == '-t': 22 tabsize = int(optvalue) 23 24 return max(process(filename, tabsize) for filename in args) 25 26 27def process(filename, tabsize, verbose=True): 28 try: 29 with tokenize.open(filename) as f: 30 text = f.read() 31 encoding = f.encoding 32 except IOError as msg: 33 print("%r: I/O error: %s" % (filename, msg)) 34 return 2 35 newtext = text.expandtabs(tabsize) 36 if newtext == text: 37 return 0 38 backup = filename + "~" 39 try: 40 os.unlink(backup) 41 except OSError: 42 pass 43 try: 44 os.rename(filename, backup) 45 except OSError: 46 pass 47 with open(filename, "w", encoding=encoding) as f: 48 f.write(newtext) 49 if verbose: 50 print(filename) 51 return 1 52 53 54if __name__ == '__main__': 55 raise SystemExit(main()) 56