繁体   English   中英

在Python中使用strip删除“ \\ n”?

[英]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 mapstr.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM