[英]Remove “\n” with strip in Python?
我正在处理文件文本,但是由于它的开头也有空格,当我尝试使用strip
模式和list
理解来删除\\n
,我得到了一个包含空元素的列表(" ")
而我没有不知道如何删除它们。 我有一个文本,我的代码是:
with open(filename) as f:
testo= f.readlines()
[e.strip() for e in testo]
但我得到这样的清单:
[' ', ' ', 'word1', 'word2', 'word3', ' ']
我想知道是否可以使用strip
方法解决该问题,否则可以使用另一种方法解决该问题。
您正在获取那些空字符串,因为很少有几行只是空换行符。 这是清除这些空字符串的代码。
with open(filename) as f:
testo = [e.strip() for e in f.readlines()]
final_list = list(filter(lambda x: x != '', testo))
print(final_list)
没有lambda并使用map:
with open(filename) as f:
final_list = list(filter(bool, map(str.strip, f)))
print(final_list)
另一个解决方案是:
with open(filename) as f:
testo = [x for x in f.read().splitlines() if x]
print(testo)
对于第二个解决方案,来源是: https : //stackoverflow.com/a/15233379/2988776
有关性能升级,请参阅@Patrick的答案
您可以使用生成器来读取所有行,并用strip()
不需要的换行符。
在生成器中,您仅使用那些“ Truthy”元素-空字符串被视为False
。
优点:您仅创建一个列表,并删除了空字符串:
写文件:
filename = "t.txt"
with open(filename,"w") as f:
f.write("""
c
oo
l
te
xt
""")
处理文件:
with open(filename) as f:
testo = [x for x in (line.strip() for line in f) if x] # f.readlines() not needed. f is
# an iterable in its own right
print(testo) # ['c', 'oo', 'l', 'te', 'xt']
您可以执行类似的操作:
testo = [line.strip() for line in f if line.strip()]
但这将执行strip()
两次,效率会略低。
输出:
['c', 'oo', 'l', 'te', 'xt']
Doku:
Eli Korvigo建议的替代方法是:
testo = list(filter(bool, map(str.strip, f)))
与本质上是相同的-使用生成器comp替换显式列表comp到f
map
的str.strip
f
(生成生成器),并对其应用filter
以将其馈送到列表中。
有关filter,map,bool
的文档,请参见内置函数 。
我更喜欢我; o)
根据您显示给我们的数据,看起来好像有一条线,其中只有一个空格。 考虑到这一点,您必须决定是否要这样做。
如果您需要它,那么您的代码应如下所示:
with open(filename) as f:
testo=f.readlines()
list(filter(None, (l.rstrip('\n') for l in testo)))
如果您不希望仅使用空格字符的行,则可以执行以下操作:
with open(filename) as f:
testo=f.readlines()
[e.rstrip('\n') for e in testo if e.strip()]
在这种情况下,我们避免将“带有前导和尾随空格的单词”剥离为“带有前导和尾随空格的单词”,因为在某些情况下,它可能会更改行的语义:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.