1 #! /usr/bin/env python3
2
3 "Replace tabs with spaces in argument files. Print names of changed files."
4
5 import os
6 import sys
7 import getopt
8 import tokenize
9
10 def 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 for filename in args:
25 process(filename, tabsize)
26
27
28 def process(filename, tabsize, verbose=True):
29 try:
30 with tokenize.open(filename) as f:
31 text = f.read()
32 encoding = f.encoding
33 except IOError as msg:
34 print("%r: I/O error: %s" % (filename, msg))
35 return
36 newtext = text.expandtabs(tabsize)
37 if newtext == text:
38 return
39 backup = filename + "~"
40 try:
41 os.unlink(backup)
42 except OSError:
43 pass
44 try:
45 os.rename(filename, backup)
46 except OSError:
47 pass
48 with open(filename, "w", encoding=encoding) as f:
49 f.write(newtext)
50 if verbose:
51 print(filename)
52
53
54 if __name__ == '__main__':
55 main()