我正在处理文件文本,但是由于它的开头也有空格,因此当我尝试使用\n
模式和strip
理解删除list
时,我得到一个包含空元素(" ")
的列表,但我不知道如何删除它们。
我有一个文本,我的代码是:
with open(filename) as f:
testo= f.readlines()
[e.strip() for e in testo]
但是我得到这样的列表:
[' ', ' ', 'word1', 'word2', 'word3', ' ']
我想知道是否可以使用strip
方法解决该问题,否则可以使用另一种方法解决。
答案 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()]
在这种情况下,我们避免将“带有前导和尾随空格的单词”剥离为“带有前导和尾随空格的单词”,因为在某些情况下,它可能会更改行的语义:)