空格与tab互相转换

def tab2space(s, ts=4):
    out = ''; i = 0
    for c in s:
        if c == '\t':
            j = ((i + ts) // ts) * ts
            out += (j - i) * ' '
            i = j
        else: out += c; i += 1
    return out

def space2tab(s, ts=4):
    def totab(b, e):
        if b < 0: return ''
        out = ''
        while b < e: # 好在CPU快,就这么滴吧……
            n = e - b
            if n >= ts: out += '\t'; b = ((b + ts) // ts) * ts
            else: out += n * ' '; break
        return out
    out = ''; i = -1
    for j in range(len(s)):
        if s[j] == ' ':
            if i < 0: i = j
        else: out += totab(i, j) + s[j]; i = -1
    return out

s = tab2space(' \t1 \t2 \t  3\t4'); print(s)
s = space2tab(s); print(s)

上面的代码未经严格测试,处理一批文件前请做好备份

glob.glob(pathname, *, recursive=False) # 中间的*是说它后面的recursive是名字参数而不是位置参数
fn(a, b, c)里的a,b,c是位置参数; glob('./*.c', recursive=True)里的recursive是名字参数。
If recursive is true, the pattern ** will match any files and zero or more directories.
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']

Windows下文本文件用\r\n分隔行,Linux下用\n。'rt'或'wt'模式open,会做\r\n和\n间的相互转换。Linux下也可以用'rt'或'wt'. 'rb'或'wb'时不做转换。open还有个newline参数指定分隔符:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Linux下vim打开文本文件时,可能在每行末尾显示个^M, 它是Ctrl-M, \r, carriage return, 回车(打字机的打字头回到最左边), \n是new line, 新行,搬下打字机的把手换一行。两条命令dos2unix和unix2dos可删除或添加\r. 可能需要apt-get install dos2unix之类。

vim里ts是tab size的缩写,sw是shift width的缩写, tw是text width的缩写。除了全局设定(.vimrc)外,还可以每个文件单独设置: mode line. mode line放在所用语言的注释的里,如//, /* */ #,vim只看有没有vim: 例如: /* vim: set sw=4 ts=4 */

vim的modeline - 博客园   ASCII中的控制字符 - 博客园   带鱼屏时代tw=60, are you kidding me?

补充: MadEdit有空格和TAB互转功能,在编辑-高级里,但它只有多文件查找/替换字符串,没有多文件空格和TAB互转。

posted @ 2021-12-31 11:26  Fun_with_Words  阅读(262)  评论(0编辑  收藏  举报









 张牌。