【问题标题】:Read a File 8 Lines at a Time Python一次读取文件 8 行 Python
【发布时间】:2012-12-17 06:10:03
【问题描述】:

您好,我正在尝试一次读取 8 行 Python 文件,并将当前的 8 行用作 str 变量

但是我无法正确执行此操作,希望能提供任何帮助

with open("test.txt", 'r') as infile:
    lines_gen = islice(infile, 8)
    for lines in lines_gen:
        firstname = str(lines[0])
        lastname = str(lines[1])
        email = str(lines[2])

...

我怎样才能做到这一点

*干杯

请大家帮忙

【问题讨论】:

标签: python


【解决方案1】:

一次使用通常的 n 个东西

from itertools import izip

with open("test.txt") as f:
    line_gen = izip(*[f]*8)
    for lines in line_gen:
        print lines
        firstname, lastname, email, fourth, fifth, sixth, seventh, eighth = lines
        ...

【讨论】:

    【解决方案2】:

    使用 itertools.islice 的简单实现

    from itertools import islice
    with open("test.txt") as fin:
        try:
            while True:
                data =  islice(fin, 0, 8)
    
                firstname = next(data)
                lastname = next(data)
                email = next(data)
                #.....
        except StopIteration:
            pass
    

    更好的pythonic实现

    >>> from collections import namedtuple
    >>> from itertools import islice
    >>> records = namedtuple('record',
                      ('firstname','lastname','email' #, .....
                   ))
    >>> with open("test.txt") as fin:
        try:
            while True:
                data =  islice(fin, 0, 3)
    
                data = record(*data)
                print data.firstname, data.lastname, data.email #.......
        except (StopIteration, TypeError):
            pass
    

    【讨论】:

    • 这将导致无限循环。
    • @AshwiniChaudhary:你能想出一个可能导致这个 sn-p 无限循环的场景吗?
    • 我不好,这是一个缩进问题,这就是为什么我得到不同的输出。 +1
    • @AshwiniChaudhary:我使用 namedtuple 发布了一个更好的 Pythonic 解决方案
    • firstname,lastname,email,....=[next(data) for _ in range(8)] 在这里也可以正常工作。
    【解决方案3】:

    这个怎么样:-

    with open("test.txt", 'r') as infile:
        lines_gen = infile.readlines()
        for i in range(0, len(lines_gen), 8):
            (firstname, lastname, email, etc1, ..) = lines_gen[i:i+8]
    

    未经测试

    【讨论】:

    • len() 在迭代器上? len(lines_gen).
    • 是的,我的错。更新。谢谢。
    • 还是错了,变量lines会提升NameErrorislice() based 解决方案在这里会更好,因为使用 readlines() 将整个文件加载到内存中。
    • 好吧,这似乎解决了我在将 lines[i:i+8] 更改为 lines_gen[i:i+8] 后需要的问题,不知道这是否准确但似乎有效跨度>
    • @AshwiniChaudhary 谢谢。再次更新。
    【解决方案4】:

    试试这个:

    every_eight = []
    lines = open('test.txt').readlines()
    j = 0
    for n in range(0, len(lines) +1, 8):
        every_eight.append(''.join([lines[l] for l in range(j, n)]))
        j = n
    

    顺便说一句,如果你想接受大量的人或某事的大量输入,你可以尝试在这样的列表中使用字典:

    info = []
    
    every_eight = []
    lines = open('test.txt').readlines()
    j = 0
    for n in range(0, len(lines) +1, 8):
        every_eight.append([lines[l] for l in range(j, n)])
        j = n
    
    for setinf in every_eight:
        if len(setinf) == 8:
            info.append({
                    'firstname': setinf[0],
                    'lastname' : setinf[1],
                    'email'    : setinf[2],
                })
    
    for inf in info:
        print inf
    

    【讨论】:

      【解决方案5】:
      with open("test.txt", 'r') as infile:
          it = iter(infile)
          while True:
              lines_list = []
              try:
                  for i in range(8):
                      lines_list.append(next(it))
              except StopIteration:
                  if len(lines_list) == 0:
                      break
              for eight_lines in lines_list:
                  # Do something with eight_lines[0:8]
      

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2011-09-03
        • 2011-08-15
        相关资源
        最近更新 更多