does anyon want to write an untabify command? - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: General (https://python-forum.io/forum-1.html) +--- Forum: News and Discussions (https://python-forum.io/forum-31.html) +--- Thread: does anyon want to write an untabify command? (/thread-20889.html) Pages:
1
2
|
does anyon want to write an untabify command? - Skaperen - Sep-04-2019 i know Linux has a command called "expand" intended to remove tabs. but it doesn't work right. when you run it with a file name, it just outputs the file, without tabs, to stdout, instead of replacing the file (and leaving a backup). and i have no idea what is on Windows or Mac OSX. a pip search comes up empty. does someone want to do this or does everyone want me to do it? RE: does anyon want to write an untabify command? - wavic - Sep-05-2019 How about sed? RE: does anyon want to write an untabify command? - Skaperen - Sep-06-2019 why sed? RE: does anyon want to write an untabify command? - wavic - Sep-06-2019 Because it's made just for this. RE: does anyon want to write an untabify command? - Skaperen - Sep-06-2019 sed is made for editing. i see nothing in its man page about tabs. RE: does anyon want to write an untabify command? - buran - Sep-06-2019 (Sep-06-2019, 08:21 PM)Skaperen Wrote: sed is made for editing. i see nothing in its man page about tabs. https://linuxconfig.org/replace-all-tab-characters-with-spaces RE: does anyon want to write an untabify command? - Skaperen - Sep-06-2019 a tab does not mean a fixed amount of spacing from where it is, instead, it means whatever amount of spacing to get to the fixed position of the next tab stop. i know of no way that "sed" can do this. the "expand" command does this correctly, but cannot update a file in place. RE: does anyon want to write an untabify command? - snippsat - Sep-08-2019 (Sep-06-2019, 10:35 PM)Skaperen Wrote: a tab does not mean a fixed amount of spacing from where it is, instead, it means whatever amount of spacing to get to the fixed position of the next tab stop.Yes it's more diabolical,and a little more difficult to write. Why do you not try yourself? As i started look into this,i did write some code that can do both tab to space or even space. For in place change of file in-place,and i did use Click to make it a command line tool(no decorator question now) If you want to use some code can take functions out they work stand alone. # tab.py import click import re import in_place @click.group() def cli(): """ \b tab-space: Tab to space replace like Linux <expand> command Usage: tab-space --tabs 4 file_1.txt --- tab-even: Tab to equal spacing between text content Usage: tab-even --space 4 file_1.txt """ pass def tab__space(text, tabs=8): result = '' for c in text: if c == '\t': result += ' ' while len(result) % tabs != 0: result += ' ' else: result += c return result @cli.command() @click.option('-t', '--tabs', default=8, help='Number of spaces') @click.argument('file', type=click.Path(exists=True)) def tab_space(file, tabs=8): with in_place.InPlace(file) as f_out: for line in f_out: line = tab__space(line, tabs) f_out.write(line) @cli.command() @click.option('-s', '--space', default=4, help='Number of spaces') @click.argument('file', type=click.Path(exists=True)) def tab_even(file, space=4): with in_place.InPlace(file) as f: text = f.read() result = re.sub(r'\s\s+|\t', ' '*space, text) click.echo(result) f.write(result) if __name__ == '__main__': cli()Usage:
RE: does anyon want to write an untabify command? - Skaperen - Sep-08-2019 i was expecting some existing function that just does it. i like that in_place module. too bad i can't assume every python installation has it. and i wish they would quit naming things with CamelCase. RE: does anyon want to write an untabify command? - snippsat - Sep-09-2019 (Sep-08-2019, 06:17 PM)Skaperen Wrote: i was expecting some existing function that just does it.Yes with your none exciting effort,you should except that Skaperen Wrote:i like that in_place module. too bad i can't assume every python installation has it. and i wish they would quit naming things with CamelCase.There is a option in standard library fileinput with inplace=True ,but it not so nice to use,in-place module dos it better and are simpler to use.As mention all code is there,here taken out. import re import in_place def tab_space(text, tabs=8): result = '' for c in text: if c == '\t': result += ' ' while len(result) % tabs != 0: result += ' ' else: result += c return result def tab_even(file, space=4): with in_place.InPlace(file) as f: text = f.read() result = re.sub(r'\s\s+|\t', ' '*space, text) f.write(result) if __name__ == '__main__': #--- Tab space ---# file = 'file_1.txt' tabs = 4 with in_place.InPlace(file) as f_out: for line in f_out: line = tab_space(line, tabs) f_out.write(line) #--- Even Space ---# #file = 'file_1.txt' #tab_even(file, space=8)Test file file_1.txt .
|