【问题标题】:mulitple loop for reading bands in python在python中读取波段的多个循环
【发布时间】:2020-11-22 15:00:54
【问题描述】:

我想从 python 中的图像中读取单独的表格。我有 10 张图片 (b1,b2,b3....b10) 有 8 个波段,我必须在其中执行此功能

b1 = rasterio.open('B1.tif')
b2 = rasterio.open('B2.tif')
b3 = rasterio.open('B3.tif')
...
b10 = rasterio.open('B10.tif')

我只用一个循环和更新就开始尝试这个。但是出现了这个错误

b1 = rasterio.open('B1.tif')
for i in range(1,8):
    b1_(i) = b1.read(i)
 File "<ipython-input-4-c7fe8df05d17>", line 3
    b1_(i) = b1.read(i)
    ^
SyntaxError: cannot assign to function call

【问题讨论】:

  • 欢迎来到 SO。你试过什么?将您的代码和任何错误/输出添加到您的问题中,这将帮助其他人找到解决您问题的方法。阅读SO guide to asking a question可能对您有所帮助。

标签: python arrays loops


【解决方案1】:

我猜你假设,python 解释器会将b1_(i) 解析为例如b1_10 如果 i 在该循环中等于 10。然而,这不是 python 语言定义的一部分。事实上,正如错误所说,这个语法看起来像是对解释器的函数调用(函数 b1_ 带有参数 i)。

为了使您的代码能够被解释,(但请注意,这是编码的一个坏习惯,我将在下面提出一个可能的解决方案,)您可以将b1_(i) = b1.read(i) 替换为eval("b1_"+str(i)+"b1.read("+str(i)+")")eval 是一个函数,它接受一个字符串并将其计算为一行代码。

如前所述,这是一种糟糕的编码风格。使用eval 的代码更难阅读,因为这个简单的例子应该已经充分展示了。此外,eval 在某些情况下容易受到代码注入的影响,这可能会导致安全问题。 (特别是,如果 eval 用于执行一段代码,其中包含用户输入的数据,用户可以利用这一事实自行注入恶意代码。)还有其他问题,但进一步讨论会不必要地膨胀这个答案;您可以考虑在这里对自己进行一些研究。

那么怎么做才对呢?最好的方法是使用一个值数组而不是许多不同的变量。你可以在 python 中这样做:

fp_b1 = rasterio.open('B1.tif')
store_b1 = []
for i in range(1,9):
    store_b1[i] = fp_b1.read(i)

请注意,我还必须更改范围的参数,因为范围不包括停止。

由于数组在 python(和许多其他编程语言)中通常以索引 0 开头,因此这段代码可能会这样编写:

fp_b1 = rasterio.open('B1.tif')
store_b1 = []
for i in range(8):
    store_b1[i] = fp_b1.read(i+1)

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2017-06-11
    • 2020-09-13
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多