【问题标题】:Cutting some specific lines from a text and putting them into another file从文本中剪切一些特定的行并将它们放入另一个文件中
【发布时间】:2013-01-20 15:29:31
【问题描述】:

我有一个包含行的文本文件。我想剪切列表中编号的行,并将它们放入另一个文件中。

例如,如果我有一个包含[1, 3, 67] 的列表,那么我想将第 1 行、第 3 行和第 67 行放入一个新文件中,并将它们从原始文件中删除。在 Python 中最简单的方法是什么?

【问题讨论】:

    标签: python file file-io


    【解决方案1】:

    如果您不想将所有行都保留在内存中,这里有一个想法:

    def lines(fname, numbers):
        numbers = sorted(numbers, reverse=True)
        with open(fname) as f:
            for n, line in enumerate(f, 1):
                if n == numbers[-1]:
                    yield line
                    numbers.pop()
                    if not numbers:
                         break
    

    文档链接:

    编辑:如果您可以一次读取整个文件(并希望返回行列表),您可以使用 readlines() 获取所有行的列表,但是对我来说无论如何这没有意义,所以我会做我上面展示的。但是,您可以这样做:

    def lines(fname, numbers):
        with open(fname) as f:
            lines = f.readlines()
            return [lines[i] for i in numbers]
    

    如果您想要“自然”编号,请将 lines[i] 更改为 lines[i+1]

    Edit2:然后你还需要编写两个新文件:一个包含这些行,一个包含其余行。为此,open 文件并使用文件对象的 writelines 方法。

    【讨论】:

    • 既然您要使用面向生成器的实现,我认为izip 会更好?
    • @LevLevitsky 将所有行保存在内存中对我来说不是问题,因为没有很大的数字,在这种情况下您能否提供另一个版本的代码?谢谢
    • @SanjayT.Sharma 好点,谢谢。我忘记了 zip 返回了一个列表,因为我尽可能尝试使用 Python 3。 itertools.izip 在 Python 3 上不存在,因为 zipizip 在 Python 2 上所做的一样。
    • for n, line in enumerate(f, 1): 会不会更简单,并且可以在 Python 2 和 Python 3 中工作?
    • if n == number[-1] 处存在缩进问题
    【解决方案2】:

    使用itertools.islice()

    例如,如果文件是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    代码:

    In [107]: li=[2,4,6]  # this list should be sorted first
    In [108]: with open("abc.txt") as f:
        prev=0
        for num in li:
            print list(islice(f,num-prev-1,num-prev))       
            prev=num
       .....:         
    ['2\n']
    ['4\n']
    ['6\n']
    
    In [109]: li=[1,7,9]
    
    In [110]: with open("abc.txt") as f:
        prev=0
        for num in li:
            print list(islice(f,num-prev-1,num-prev))  #print or do something else     
            prev=num
       .....:         
    ['1\n']
    ['7\n']
    ['9\n']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2023-02-03
      • 1970-01-01
      相关资源
      最近更新 更多