0

假设您正在从一个结构如下的文件中读取输入

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 人一组。我有正确的代码来读取这些信息,但我似乎无法克服如何通过令牌而不是按行来读取信息的问题。

这并不能解释不完美的输入。

4

2 回答 2

0

如果您的文件包含三个值的组(在第一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).

请注意,如果它们不构成三个一组,这将丢弃文件末尾的任何剩余值。如果您需要以不同的方式处理这种情况,我建议zip_longestitertools模块中使用,而不是常规zip函数。(请参阅文档grouper中的配方。)itertools

于 2014-04-08T17:37:29.760 回答
0

这是使用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]
于 2014-04-08T02:37:57.903 回答