【问题标题】:Python - ignore lines in a filePython - 忽略文件中的行
【发布时间】:2010-12-28 05:46:36
【问题描述】:

如何忽略文件中的行?

例子:

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

以上是大体思路,但我是制作死代码的专家!怎么把它变成不死生物?

【问题讨论】:

  • 我会把它变成一个常规循环,可能有一个用于测试每一行的函数。随着您添加更多条件,列表理解将很快变得笨拙。

标签: python loops file line


【解决方案1】:

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

还有一个问题!

示例文件格式:

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

到目前为止,为您的建议干杯, 海鲜。

@Nadia,现在我的日子似乎更有价值了!我花了几个小时(甚至几天)试图破解这个独奏!谢谢!

【讨论】:

  • int() 将有效字符串(或其他有效表示形式,如浮点数)转换为整数。将字符串列表转换为数字的一个简单而简单的解决方案是 map(int, numberStrings)。这将函数“int”映射到列表中的每个字符串。请注意无效值,这将产生异常。
  • @Seafoid:请使用“”按钮提出新问题(如果问题相关,则插入链接(每个问题/答案都有 url)。
【解决方案2】:
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()

【讨论】:

    【解决方案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 子句进行“过滤”:

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

    【讨论】:

    • 我仍在努力学习 python 基础知识,所以我试图避免导入模块。我需要重新发明轮子才能学习代码!当我更熟练时,我会注意这一点。谢谢!
    【解决方案4】:

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

    【讨论】:

    • 试着想一想如何才能让这个更短……但我认为你做不到。
    • 我喜欢这个并且真的理解它。不幸的是,它打印了一个空列表。我一定是做错了什么!
    • @Seafoid,你确定吗?我只是在本地文件上尝试过它,它工作得很好。也许您正在阅读该文件两次?只读一次
    • 你们这些真正的计算机科学家必须憎恶我们这些卑微的生物学家把你们的领地弄得一团糟!!!
    • 不,实际上很高兴见到 IT 编程以外的人 :)
    【解决方案5】:

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

    【讨论】:

    • 已弃用,取而代之的是 !=,在这种情况下,startswith 和 endswith 更加清晰。
    • 是的。这里的主要概念主要是第一句话中所述 - 您可以通过if 条件过滤列表推导。
    【解决方案6】:

    一种方法是将“通过”替换为“继续”。这将继续到文件中的下一行而不做任何事情。您还需要将行追加到 list_1

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

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多