在"for line in data"循环中使用.readline()将多行文件分配给多个变量

Pyr*_*rok 2 python file-io for-loop python-3.x

我正在尝试使用for line in data:循环将文件的前3行分配给3个不同的变量(每个变量一行)并让它每3行迭代一次,这样如果文件中有9行,每个变量在整个迭代过程中将包含3个不同的行,但我无法弄明白.

到目前为止,我的基本代码看起来像这样:

for line in infile:

  to_line = infile.readline()
  from_line = infile.readline()
  header_line = infile.readline()
Run Code Online (Sandbox Code Playgroud)

但它根本不起作用.它将我的文件的每隔一行分配给每个变量(即每个变量有4行而不是所有行都被分配).

该程序的前提是处理一个包含9行的输入文件(每个电子邮件的"到"行,"从"行和"主题"行[总共3封电子邮件]),然后根据它们是否排序是垃圾邮件或"好"的邮件.

我对此有一个棘手的规定是,这是一个大学课程,我不允许使用我们尚未在课堂上进行的任何事情(我们已经有8个星期了,所以我们有一个基本信息的小知识库使用).如果有人回复我不能使用的任何东西,我会告诉你.

phi*_*hag 10

你实际上并不需要调用readline,只需遍历文件即可.您可以使用该zip功能重新组合线条.因此,通用解决方案看起来像

for odd_line,even_line in zip(infile, infile):
     # Do something
Run Code Online (Sandbox Code Playgroud)

如果你想首先创建一个包含所有偶数和奇数行的列表(这很少是一个好的数据结构),你可以只追加到一个列表,如下所示:

odd_lines = []
even_lines = []
for odd_line,even_line in zip(infile, infile):
     odd_lines.append(odd_line)
     even_lines.append(even_line)
Run Code Online (Sandbox Code Playgroud)

或者,使用

lines = list(infile)
Run Code Online (Sandbox Code Playgroud)

获取所有行的列表,然后切片以提取文件的一部分.例如,

even_lines = lines[1::2]
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用带while循环的迭代器.只需next多次拨打电话.例如,这会打印所有奇数行:

iterator = iter(infile)
while True:
  try:
    odd_line = next(iterator)
    print(odd_line)
    even_line = next(iterator)
  except StopIteration:
    break
Run Code Online (Sandbox Code Playgroud)

如果你不想使用break(而且这很疯狂),你可以简单地捕获循环之外的异常:

iterator = iter(infile)
try:
  while True:
    odd_line = next(iterator)
    print(odd_line)
    even_line = next(iterator)
except StopIteration:
  pass # end of file reached
Run Code Online (Sandbox Code Playgroud)

您也可以使用readline以下代码而不是使用迭代器:

odd_lines = []
even_lines = []
while True:
  line = infile.readline()
  if not line: # End of file reached
    break
  odd_lines.append(line)

  line = infile.readline()
  if not line: # End of file reached
    break
  even_lines.append(line)
Run Code Online (Sandbox Code Playgroud)

同样,如果你真的不能使用break语句,你可以伪造它们:

odd_lines = []
even_lines = []
go_on = True
while go_on:
  line = infile.readline()
  if even_line:
    odd_lines.append(line)
    line = infile.readline()
    if line:
      even_lines.append(line)
    else:
      go_on = False
Run Code Online (Sandbox Code Playgroud)


Ray*_*ger 5

由于文件是迭代器,因此可以将它们压缩成组.这意味着您的问题的答案是一段非常简单的代码:

with open(filename) as f:
    for to_line, from_line, header_line in zip(f, f, f):
        print (to_line, from_line, header_line)
Run Code Online (Sandbox Code Playgroud)

对于不允许使用zip的学生,以下内容也适用:

f = open(filename)
try:
    while True:
        to_line, from_line, header_line = next(f), next(f), next(f)
        print (to_line, from_line, header_line)
except StopIteration:
    pass
finally:
    f.close()
Run Code Online (Sandbox Code Playgroud)