强制字符串为一个衬垫

时间:2016-03-31 17:18:45

标签: python

有谁知道将一根绳子强行插入一个衬垫的替代方法? 可能是一个python内置方法? 或者更好的实施(解释原因)?

例如:

Hello World
Foo Bar

成为

Hello World Foo Bar

实施

def strip_newline(s):
    return ' '.join(mystring.splitlines())

strip_newline = lambda _: ' '.join(_.splitlines())

额外注意:

对于那些提醒我\n字符替换的人,中有一个字符。缺点是您需要注意\r,回车符。 : - )

因此你需要做mystring.replace('\r', ' ').replace('\n', ' ')

3 个答案:

答案 0 :(得分:3)

我认为简单的replace是最快的方法:

s = '''
1
2
3
4
5
'''

print (s.replace("\n", " "))

答案 1 :(得分:2)

<强>性能

我在bash shell中对两种方法进行了计时,看起来很简单

stri.replace("\n", " ")

比您提出的解决方案更快。

(文件hello.txt是一个包含1000行,短语为“Hello World”的文件。)

~$ time python -c 'f = open("hello.txt","r"); stri = f.read(); stri.replace("\n", " ")'

real    0m0.130s
user    0m0.021s
sys     0m0.023s

~$ time python -c 'f = open("hello.txt","r"); stri = f.read(); " ".join(stri.splitlines())'

real    0m0.317s
user    0m0.032s
sys     0m0.028s

或者,如果您使用readlines()方法而非read()方法,则可以取消对splitlines()的调用,并在那里获得一些性能提升。

~$ time python -c 'f = open("hello.txt","r"); stri = f.readlines(); " ".join(stri)'

real    0m0.176s
user    0m0.033s
sys     0m0.026s

行结尾

我正在使用linux,所以我不必担心\r字符。但是,在您的情况下,Windows行结尾的格式始终为\r\n,因此您可以将两次调用替换为replace()方法

stri.replace("\r", " ").replace("\n", " ")

只需一个电话:

stri.replace("\r\n", " ")

也应该提高性能。

答案 2 :(得分:0)

其他方法是使用str.translate方法,通过构建翻译字典(char_to_remove:无映射),然后通过str.translate应用它:

>>> import string
>>> string.whitespace
' \t\n\r\x0b\x0c'
>>> st
'\n1\n2\n3\n4\n5\n'
>>>
>>> dws = dict.fromkeys(ord(c) for c in string.whitespace)
>>> 
>>> dws
{32: None, 9: None, 10: None, 11: None, 12: None, 13: None}
>>> 
>>> st.translate(dws)
'12345' 

当然,这会删除字符串中的空格,您可以通过条件理解跳过这种情况:

>>> dws = dict.fromkeys(ord(c) for c in string.whitespace if c != ' ')

或者简单地说:

>>> import os
>>> os.linesep
'\n' #on my ubuntu box
>>> st.translate({ord(os.linesep):None})
'12345'