我有一条跨越多条(2-3)行的错误消息。我想抓住它并嵌入一个警告。我认为将新行替换为空格是可以的。
我的问题是,哪种方法是最佳做法。我知道这不是最好的问题,但我想正确编码。我也可能会遗漏一些东西。到目前为止,我已经提出了3种方法:
我倾向于使用string.translate(),但是在阅读它是如何工作之后,我认为除了'\ n'之外,将每个角色都隐藏起来是一种过度杀伤力。 Regexp对于这么简单的任务来说似乎也是一种过度杀伤。
是否指定了其他任何方法,或者我应该选择上述方法之一?我关心的是可移植性和稳健性而不是速度,但它仍然有些相关。
答案 0 :(得分:4)
只需使用replace
方法:
>>> "\na".replace("\n", " ")
' a'
>>>
这是最简单的解决方案。使用Regex是过度的,也意味着你必须导入。 translate
稍微好一些,但仍然没有提供replace
没有的任何内容(当然除了更多的输入外)。
replace
也应该跑得更快。
答案 1 :(得分:3)
如果您想将所有这些实现细节留给python实现,您可以这样做:
s = "This\nis\r\na\rtest"
print " ".join(s.splitlines())
# prints: This is a test
注意:
此方法使用通用换行符方法分割行。
这意味着:
通用换行符一种解释文本流的方式,其中所有以下内容都被识别为一行:Unix行尾约定
'\n'
,Windows约定{{ 1}}和旧的Macintosh约定'\r\n'
。有关其他用途,请参阅PEP 278和PEP 3116以及'\r'
。
分割线条比替换换行符的好处是可以过滤掉不需要的线条,即避免日志混乱。例如,如果您的输出为str.splitlines()
:
traceback.format_exc()
并且您只需要在日志中添加最后一行:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero
供参考:
答案 2 :(得分:1)
这是另一种快速/便携式选择。它与替换或多或少相同,但不太可读
errMsg = """Something went wrong
This message is long"""
" ".join(errMsg.splitlines())
有了计时结果,虽然我保证根据邮件长度会有所不同
>>> s = """\
' '.join('''Something went wrong
This message is long'''.splitlines())"""
>>> timeit.timeit(stmt=s, number=100000)
0.06071170746817329
>>> q = """'''\
Something went wrong
This message is long'''.replace("\\n",' ')"""
>>> timeit.timeit(stmt=q, number=100000)
0.049164684830429906
答案 3 :(得分:0)
这应该适用于Windows和Linux。
string.replace('\r\n', ' ').replace('\n', ' ')