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)
由于文件是迭代器,因此可以将它们压缩成组.这意味着您的问题的答案是一段非常简单的代码:
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)
归档时间: |
|
查看次数: |
6889 次 |
最近记录: |