从 python 3.x 中的文件读取输入



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

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配方。

最新更新