Python - 忽略文件中的行

2 投票
6 回答
27608 浏览
提问于 2025-04-15 17:11

如何在文件中忽略某些行呢?

举个例子:

假设你知道文件的前几行是以字母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'))
]

撰写回答