Python - 忽略文件中的行
如何在文件中忽略某些行呢?
举个例子:
假设你知道文件的前几行是以字母a或b开头的,而剩下的行是以字母c结尾的。那么,怎么处理这个文件,让以a或b开头的行被忽略,而以c结尾的行被转换成一个嵌套列表呢?
我现在的进展是:
fname = raw_input('Enter file name: ')
z = open(fname, 'r')
#I tried this but it converts all lines to a nested list
z_list = [i.strip().split() for i in z]
我在想我需要用一个循环。
for line in z:
if line[0] == 'a':
pass
if line[0] == 'b':
pass
if line[-1] == 'c':
list_1 = [line.strip().split()]
上面是大致的思路,但我总是写出一些没用的代码!怎么才能让这些代码变得有用呢?
6 个回答
2
你可以在列表推导式中添加if
条件。
z_list = [i.strip().split() for i in z if i[-1] == 'c']
或者
z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]
3
一种很常见的方法是通过去掉一些行来“过滤”文件:
import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]
你可以在任何时候使用 itertools.ifilter
来“选择性过滤”一个可迭代对象,这样你就能得到一个新的可迭代对象,里面只包含那些满足特定条件的项目——这就是我说这种方法很通用的原因。itertools 提供了很多很棒、很快速的工具,可以用来处理各种各样的可迭代对象,非常值得学习。
还有一种类似但语法上更简单的方法,这种方法在你的情况下也足够用了(因此我推荐这种简单的方法),就是在列表推导式中使用 if
条件来进行“过滤”:
zlist = [l.strip.split() for l in z if l[0] not in 'ab']
9
startswith 这个方法可以接受一个字符串的元组来进行匹配,所以你可以这样做:
[line.strip().split() for line in z if not line.startswith(('a', 'b'))]
这样做即使 a 和 b 是单词或句子,而不仅仅是字符,也能正常工作。如果有些情况是行的开头既不是 a 也不是 b,但结尾也不是 c,你可以把列表推导式扩展成这样:
[
line.strip().split()
for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]