背景:

shell 传给 python 脚本了一个 \t 分隔符,本来以为会按照 \t 分割,结果发现,Python 会把这个当做字符串,怎么都不行。

1
2
3
4
5
if [[ ! "$5" ]];then
delimiter="\t"
else
delimiter=$5
fi

如下所示,原始数据,并没有被 \t 分割。

1
2
\t
['20191111\t15\t116.425149753\t40.1362992101\t8']

真是奇怪了, python 里面就是用 \t 标识制表符啊,怎么回事儿? 

解决:

解决方法1:
通过 if 判断发现, \t 并不会被当做制表符。delimiter 打印出来看上去是 \t ,但是判断是否和 "\t" 相等的时候,发现就是不行,怎么办呢?经过尝试,发现下面方式可以判断,使用 “\t” 即可。

1
2
3
4
if "\\t" == str(delimiter):
delimiter = "\t"
else:
delimiter = delimiter

所以我们就明白了,通过 shell 传入的实际上是经过转义的 \t(制表符), 前面是附加了  \ 的。 所以,我们要去除转义。如上所示,使用 if 判断,特殊处理即可。

解决方法2:
明白上面问题之后,我们还可以通过去除转义来解决问题,

1
delimiter = sys.argv[5].decode("string_escape")

如上所示,通过 .decode(“string_escape”) 来去掉转义,之后就能正常作为分割符了。
另外,如果是纯字符串,也可以使用 r 来防止转义。我们读取文件的时候,经常看到下面写法:  with open(r"a/b/c.txt" )   这里面的 r 就是防止转义,来找到正确的文件位置。