10 题: 使用python,如何从第七行开始读取文件?

在...创建的问题 Wed, Apr 8, 2015 12:00 AM

我有一个文本文件结构:

 
date
downland

user 

date data1 date2
201102 foo bar 200 50
201101 foo bar 300 35

因此不需要前六行文件。文件名:dnw.txt

 
f = open('dwn.txt', 'rb')

如何从第7行开始将此文件“拆分”为EOF?

    
15
  1. 一般来说,你会如何逐行读取文件?你的教程会解释一下吗?
    2011-02-01 15:24:02Z
  2. 2011-02-01 15:25:59Z
  3. 我的教程。没有一个....我最经常使用的方法是用于???。split(“\r \n”):这是你的问题吗?
    2011-02-01 15:28:20Z
  4. 2011-02-01 15:30:23Z
  5. 为什么要以二进制模式读取文本文件?
    2011-02-01 18:04:29Z
  6. 醇>
    10个答案                              10 跨度>                         
     
    with open('dwn.txt') as f:
        for i in xrange(6):
            f.next()
        for line in f:
            process(line)
    
        
    28
    2011-02-01 18:12:40Z
    1. 这两位(到目前为止)匿名下来的人有没有机会分享他们的智慧?
      2011-02-01 20:23:34Z
    2. 老实说,这是最惯用的解决方案,代码直接告诉你它的作用。
      2011-02-01 21:24:09Z
    3. @ user428862:process(line)是伪代码,用于“在此处插入您自己的代码以使用line执行任何操作”。什么样的代码是“你的”代码?
      2011-02-01 23:06:54Z
    4. 你的代码=你的代码: - >
      2011-02-01 23:11:06Z
    5. 这不适用于Python 3.x。得到AttributeError: '_io.TextIOWrapper' object has no attribute 'next'
      2017-01-04 16:14:30Z
    6. 醇>

    Itertools回答!

     
    from itertools import islice
    
    with open('foo') as f:
        for line in islice(f, 6, None):
            print line
    
        
    8
    2011-02-01 21:21:22Z
    1. 这比它需要的更复杂。
      2011-02-01 15:34:37Z
    2. 如果你想使用itertools那么islice将是一个更好的选择。
      2011-02-01 15:41:31Z
    3. @ Jochen islice,谢谢。我正在寻找一种叫做“掉落”的东西,找不到任何东西。
      2011-02-01 16:01:06Z
    4. - 1使用大锤破解坚果
      2011-02-01 18:00:42Z
    5. 这是一个大锤怎么样?它需要一行设置。
      2011-02-01 19:59:22Z
    6. 醇>
     
    with open('test.txt', 'r') as fo:
       for i in xrange(6):
           fo.next()
       for line in fo:
           print "%s" % line.strip()
    
        
    5
    2011-02-01 18:35:16Z

    事实上,准确地回答问题,因为它是写的

     
    How do I "split" this file starting at line 7 to EOF?
    

    你可以做到

    如果文件不大:

     
    with open('dwn.txt','rb+') as f:
        for i in xrange(6):
            print f.readline()
        content = f.read()
        f.seek(0,0)
        f.write(content)
        f.truncate()
    

    以防文件非常大

     
    with open('dwn.txt','rb+') as ahead, open('dwn.txt','rb+') as back:
        for i in xrange(6):
            print ahead.readline()
    
        x = 100000
        chunk = ahead.read(x)
        while chunk:
            print repr(chunk)
            back.write(chunk)
            chunk = ahead.read(x)
        back.truncate()
    

    truncate()功能对于放置您要求的EOF至关重要。如果不执行 truncate(),文件的尾部(对应于6行的偏移量)将保留。

    文件必须以二进制模式打开,以防止出现任何问题。

    当Python读取'\r \n'时,它会在'\n'(即默认启用的通用换行支持)转换它们,即假设链 chunk 中只有'\n',即使文件中有'\r \n'

    如果文件来自Macintosh原点,它在处理之前只包含CR = '\r'换行符,但它们将更改为'\n'或'\r \n'(根据平台)在非Macintosh计算机上重写时。

    如果它是来自Linux的文件,它只包含LF = '\n'换行符,在Windows操作系统上,它们将更改为'\r \n'(我不知道在Macintosh上处理的Linux文件)。 原因是操作系统Windows写入'\r \n'无论订购什么,'\n''\r''\r \n'。因此,重写的字符数量会比读取的数量多,然后文件指针提前返回之间的偏移量会减少并导致重写错误。

    在HTML源代码中,还有各种换行符。

    这就是为什么在处理它们时以二进制模式打开文件总是更好的原因。

        
    3
    2011-02-02 17:04:04Z
    1. 谢谢,我的系统是linux和Win
      2011-02-02 18:54:35Z
    2. 醇>

    Python 3:

     
    with open("file.txt","r") as f:
        for i in range(6):
            f.readline()
        for line in f:
            # process lines 7-end
    
        
    3
    2018-08-29 17:51:59Z

    替代版本

    如果你知道分离的字符位置read()(感兴趣的部分的标题部分)换行符,你可以直接使用命令pos,例如一个\n,在你想要打破输入文本的文本中:

     
    with open('input.txt', 'r') as txt_in:
        txt_in.seek(pos)
        second_half = txt_in.read()
    

    如果您对两个半身都感兴趣,还可以调查以下方法:

     
    with open('input.txt', 'r') as txt_in:
        all_contents = txt_in.read()
    first_half = all_contents[:pos]
    second_half = all_contents[pos:]
    
        
    1
    2015-10-26 12:38:14Z

    您可以将整个文件读入数组/列表,然后从适合您希望开始阅读的行的索引处开始。

     
    f = open('dwn.txt', 'rb')
    fileAsList = f.readlines()
    fileAsList[0] #first line
    fileAsList[1] #second line
    
        
    0
    2011-02-01 15:31:01Z
    1. - 文本文件中的1(1)'rb'(2)readlines()
      2011-02-01 17:59:33Z
    2. 醇>
     
    #!/usr/bin/python
    
    with open('dnw.txt', 'r') as f:
        lines_7_through_end = f.readlines()[6:]
    
    print "Lines 7+:"
    i = 7;
    for line in lines_7_through_end:
        print "    Line %s: %s" % (i, line)
        i+=1
    

    打印:

      

    第7行:

     
      Line 7: 201102 foo bar 200 50
    
      Line 8: 201101 foo bar 300 35
    

    修改强>

    要在没有前六行的情况下重建dwn.txt,请在上面的代码之后执行此操作:

     
    with open('dnw.txt', 'w') as f:
        for line in lines_7_through_end:
            f.write(line)
    
        
    0
    2011-02-02 15:13:04Z
    1. with with:open('dnw.txt','r')as f:lines = f.readlines()[6:] for line in lines:print “%s”%(行)
      2011-02-01 15:56:52Z
    2. 这就是所有关于SO的最佳方法都被破坏了。
      2011-02-01 16:02:07Z
    3. @ SG它的额外信息会使数据库混乱。
      2011-02-01 16:10:18Z
    4. 从Python 2.6开始,某些东西可能比使用专用索引更优雅:for (i, line) in enumerate(lines_7_through_end, 7):...这样可以避免使用i进行递增。
      2011-02-01 16:17:10Z
    5. 我认为没有必要打印第7行,第8行
      2011-02-01 16:38:43Z
    6. 醇>

    只做f.readline()六次。忽略返回的值。

        
    - 1
    2011-02-01 16:03:25Z
    1. 你自己尝试过吗?如何在一个怪异的地球上这个答案可能有两个赞成?
      是否有一些邪恶的黑客入侵者?
      2011-02-01 15:56:02Z
    2. 我相信你的意思是f.next(),那里......
      2011-02-01 15:56:04Z
    3. 我的意思是f.readline()。 .next()虽然更好。你们赢了我输了。
      2011-02-01 16:03:50Z
    4. 虽然如果你.next()然后尝试.readline()获得一个ValueError来混合迭代和读取方法。
      2011-02-01 16:06:04Z
    5. 为了解释有正当理由,您已经投票'readlines()'解决方案,但为什么要求readline()[次6]解决方案?当然这不会读取整个文件。还要注意我的问题.next()然后是.readline()。
      2011-02-01 18:22:19Z
    6. 醇>

    readlines()的解决方案在我看来并不令人满意,因为 readlines()会读取整个文件。用户必须再次读取行(在文件中或在生成的列表中)来处理他想要的内容,而它本来可以在没有第一次读取有趣行的情况下完成。此外,如果文件很大,则内存由文件内容加权,而for line in file指令则较轻。

    重复readline()可以这样做

     
    nb = 6
    exec( nb * 'f.readline()\n')
    

    这是一小段代码, nb 是可编程调整的

        
    - 1
    2011-02-01 17:48:18Z
    1. 你认真吗? exec公平地说!
      2011-02-01 17:49:38Z
    2. + 1 for not readi整个文件到内存,-100使用exec
      2011-02-01 17:56:11Z
    3. 对exec()有什么影响?它仍然在Python 3中;如果它和xreadlines()一样糟糕,它就会被弃用。我从不使用exec(),在我看来,在这种情况下,它可以缩短代码而不是用readline()
      写6行
      2011-02-01 18:51:38Z
    4. «带有readlines()的解决方案在我看来并不令人满意,因为readlines()读取整个文件。 »嗯,可以讨论。这取决于文件和目标。如果文件很大并且只有几行很有趣,那么在重新阅读之前阅读整个文件并不是一个好主意。但是如果不是很大并且列表中的所有行简化了代码或其他任何内容,那么它是可以接受的。这取决于。我不再同意自己的意见了。
      2011-02-01 19:04:35Z
    5. 醇>
来源放置 这里