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

时间:2018-11-18 08:08:17

标签: python file text strip

我正在处理文件文本,但是由于它的开头也有空格,因此当我尝试使用\n模式和strip理解删除list时,我得到一个包含空元素(" ")的列表,但我不知道如何删除它们。 我有一个文本,我的代码是:

with open(filename) as f:
    testo= f.readlines()
[e.strip() for e in testo]

但是我得到这样的列表:

[' ', ' ', 'word1', 'word2', 'word3', ' ']

我想知道是否可以使用strip方法解决该问题,否则可以使用另一种方法解决。

3 个答案:

答案 0 :(得分:1)

您正在获取那些空字符串,因为很少有几行只是空换行符。这是清除这些空字符串的代码。

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并使用地图:

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的答案

答案 1 :(得分:1)

您可以使用生成器读取所有行,并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)))

with本质上是相同的-在map上使用str.strip的{​​{1}}的生成器comp替换显式列表comp(导致生成器)并应用{{1} },将其输入到列表中。

有关f的文档,请参见built in function

虽然我更喜欢我; o)

答案 2 :(得分:0)

根据您显示给我们的数据,看起来好像有一条线,其中只有一个空格。考虑到这一点,您必须决定是否要这样做。

如果需要的话,您的代码应如下所示:

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()]

在这种情况下,我们避免将“带有前导和尾随空格的单词”剥离为“带有前导和尾随空格的单词”,因为在某些情况下,它可能会更改行的语义:)