我有一条跨多行(2-3行)的错误消息。我想抓住它并嵌入到警告中。我认为把新行替换成空格是可以的。
我的问题是,哪种方法是最好的做法。我知道这不是最好的问题,但我想正确地编码它。我也可能漏掉了什么。到目前为止,我已经想出了三个方法:
我倾向于使用string.translate(),但是在阅读了它的工作原理之后,我认为将除'\n‘之外的每个字符都隐藏到自己中是一种过分的做法。对于这样一个简单的任务来说,Regexp看起来也是一种过度浪费。
是否有其他指定的方法,或者我是否应该选择上述的方法之一?比起速度,我更关心可移植性和健壮性,但它仍然有一定的相关性。
发布于 2013-08-14 17:46:02
只需使用replace方法:
>>> "\na".replace("\n", " ")
' a'
>>>这是最简单的解决办法。使用Regex是过度的,也意味着您必须导入。translate稍微好一点,但仍然没有提供replace没有提供的东西(当然,除了更多的输入)。
replace也应该运行得更快。
发布于 2013-08-14 17:57:17
如果希望将所有这些实现细节留待python实现处理,您可以这样做:
s = "This\nis\r\na\rtest"
print " ".join(s.splitlines())
# prints: This is a test注意:
该方法使用通用的换行符方法来分割行。
这意味着:
通用换行符解释文本流的一种方式,在这种方式中,以下所有内容都被认为是行的结尾: Unix结束行约定
'\n'、Windows约定'\r\n'和旧Macintosh约定'\r'。有关额外用途,请参阅PEP 278和PEP 3116,以及str.splitlines()。
分割行而不是替换linefeed的好处是,您可以过滤掉不需要的行,即避免日志中的杂乱。例如,如果您有traceback.format_exc()的输出
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero您只需要在日志中添加最后一行:
import traceback
try:
1/0
except: # of course you wouldn't catch exceptions like this in real code
print traceback.format_exc().splitlines()[-1]
# prints: ZeroDivisionError: integer division or modulo by zero供参考:
发布于 2013-08-14 17:47:27
这是另一种快速/便携的选择。它或多或少与替换相同,但可读性较低。
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.049164684830429906https://stackoverflow.com/questions/18238694
复制相似问题