假设您正在从结构如下的文件中读取输入
P3
400 200
255
255 255 255
255 0 0
255 0 0
etc...
但是您要考虑输入文件中可能出现的任何错误,如
P3 400
200
255
255 255
255
255 0 0
255 0
0
etc...
我想读取第一个令牌"P3",然后读取接下来的两个"400"200"(高度/宽度)"255",从这里开始,我想读取每个令牌并说明它们应该如何以 3 为一组。 我有正确的代码来读取这些信息,但我似乎无法越过弄清楚如何按令牌而不是按行读取信息的墙。
这并不能解释不完美的输入。
这是使用csv
模块的一种方法:
import csv
first_four = []
all_of_the_tokens = []
first_four_processed = False
with open('token') as token_file:
csv_reader = csv.reader(token_file, delimiter=' ')
for row in csv_reader:
all_of_the_tokens.extend(row)
if not first_four_processed:
first_four.extend(row)
if len(first_four) >= 4 and not first_four_processed:
first_four_processed = True
first_four = first_four[:4]
token_file.close()
rest_of_the_tokens = all_of_the_tokens[4:]
for i in range(0, len(rest_of_the_tokens), 3):
print rest_of_the_tokens[i:i+3]
如果您的文件由三个值的组组成(在第一个P3
项之后),并且您无法依靠换行符将它们正确分组,我建议将文件作为单个字符串读取并自己进行拆分和分组。这是一个直截了当的方法:
with open(filename) as f:
text = f.read() # get the file contents as a single string
tokens = text.split() # splits the big string on any whitespace, returning a list
it = iter(tokens) # start an iterator over the list
prefix = next(it) # grab the "P3" token off the front
triples = list(zip(it, it it)) # make a list of 3-tuples from the rest of the tokens
对同一迭代器的多个引用使用 zip
是这里的关键技巧。如果需要使用相同的代码处理其他组大小,可以使用 zip(*[it]*grouplen)
.
请注意,如果文件末尾的任何剩余值未形成三个组,这将丢弃它们。如果您需要以不同的方式处理这种情况,我建议使用 itertools
模块中的zip_longest
,而不是常规的 zip
函数。(请参阅itertools
文档中的grouper
配方。