【问题标题】:Reading tokens from a file in python 3.x从 python 3.x 中的文件中读取标记
【发布时间】:2014-04-08 00:45:50
【问题描述】:

无论格式如何,是否有某种方法可以通过令牌从文件中读取信息?例如,如果我尝试从输入文件生成 ppm 图像,而不是 2 个像素

255 0 0
0 0 255

它显示为

255
0 0
0
0 255

我想在这种情况下按令牌读取,而不是在循环中按行读取,但我找不到任何与此相关的内置方法。

【问题讨论】:

  • 你认为什么是令牌?
  • 在这种情况下,我认为 255 是一个标记,或者任何其他数字。
  • 所以没有任何内置方法可以一次读取一个或一组 3 个?
  • 由于某种原因,他的答案打印出 P3 400 200 255 255 0 0 而不是 P3 400 200 255 255 255 255 0 0。它从文件中跳过了整行。

标签: python python-3.x input


【解决方案1】:

你总是可以滚动你自己的文件迭代器:

class file_tokens:
    def __init__(self, file):
        self.file = file
        self.line = []
    def __iter__(self):
        return self
    def next(self):
        while not len(self.line):
            self.line = self.file.readline()
            if not self.line:
                raise StopIteration
            self.line = self.line.split()
        return self.line.pop(0)

然后像普通文件一样使用:

for token in file_tokens(open(infile)):
    print('Token: ' + token)

【讨论】:

  • 你认为这是最好的方法吗?
  • 这取决于你的目的。如果您需要在整个代码中的多个位置执行此操作,那么我认为由于可重用性,这种方法比其他方法具有明显的优势。如果只需要使用一次,那么使用 2 级循环代替也一样好。
  • 我将运行一个 for 循环,然后我需要开始抓取 3 个一组的数字并附加它们。
  • 为了避免 iter() returned non-iterator of type 错误,您需要在 Python 3 中使用 __next__ 插入 next
【解决方案2】:

您可以使用chain.from_iterable,其中iter-able 为line.split() for line in fin

>>> with open('temp.txt', 'r') as fin:
...      iter = chain.from_iterable(line.split() for line in fin)
...      print(list(iter))
... 
['255', '0', '0', '0', '0', '255']

【讨论】:

  • 由于某种原因导致它无缘无故跳过一行,然后在一行后退出。
  • @user3448183 除非我看到代码或文件内容,否则我无法说出原因;对于您在上述问题中包含的示例确实有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多