Python - 忽略文件中的行

时间:2009-12-19 00:47:37

标签: python file loops ignore lines

如何忽略文件中的行?

示例:

如果您知道文件中的第一行将以say,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()]

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

谢谢, Seafoid。

6 个答案:

答案 0 :(得分: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'))
]

答案 1 :(得分:3)

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

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

您可以在任何时候使用itertools.ifilter“选择性地过滤”迭代,获得另一个只包含满足某个谓词的项目的迭代 - 这就是为什么我说这种方法非常普遍。 itertools有很多很棒的,快速的工具,可以用无数的方式处理迭代,非常值得研究。

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

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

答案 2 :(得分: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 :(得分:1)

一种方法是将'pass'替换为'continue'。这将继续到文件中的下一行而不做任何事情。您还需要将行附加到list_1

if line[-1] == 'c':
    list_1.append([line.strip().split()])

答案 4 :(得分:0)

f=open("file")
for line in f:
   li=line.strip()
   if not li[0] in ["a","b"] and li[-1]=="c":
      print line.rstrip()
f.close()

答案 5 :(得分:0)

对那些对解决方案感兴趣的人。

还有,另一个问题!

示例文件格式:

c this is a comment
p m 1468 1 267
260 32 0
8 1 0

代码:

fname = raw_input('Please enter the name of file: ')

z = open(fname, 'r')

required_list = [line.strip().split() for line in z if not line.startswith(('c', 'p'))]

print required_list

输出:

[['260', '32', '0'], ['8', '1', '0']]

有关如何将列表中的字符串转换为整数并执行算术运算的任何建议吗?

伪代码说明:

#for the second item in each sublist
     #if sum is > than first number in second line of file
         #pass
     #else
         #abort/raise error

到目前为止欢呼各位的人, Seafoid。

<@> @Nadia,我的日子现在看起来有点值得!我花了几个小时(甚至几天)试图破解这个独奏!谢谢!