Python-忽略fi中的行

2024-04-27 00:27:55 发布

您现在位置: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循环。

for line in z:
    if line[0] == 'a':
        pass
    if line[0] == 'b':
        pass
    if line[-1] == 'c':
        list_1 = [line.strip().split()]

以上是一般的想法,但我是专家,使死代码!如何使它不死?

谢谢, 类海生物。


Tags: 文件in示例列表forinputrawif
3条回答

您可以添加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')]

一种非常通用的方法是通过删除一些行来“过滤”文件:

import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]

您可以随时使用itertools.ifilter来“有选择地筛选”一个iterable,得到另一个iterable,它只包含满足某些谓词的项——这就是为什么我说这种方法非常通用的原因。itertools有很多很棒的、快速的工具,可以以各种方式处理iterables,非常值得研究。

一种类似但在语法上更简单的方法,在您的情况下就足够了(因此,我建议您使用简单的优点),就是使用listcomp中的if子句进行“过滤”:

zlist = [l.strip.split() for l in z if l[0] not in 'ab']

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

相关问题 更多 >