使用 python 将字符串和浮点数写入 ASCII 文件
Write strings and float number to an ASCII file with python
我一直在尝试连接两个数组(字符串数组和浮点数组),然后将最终数组写入 CSV 文件。但是,我一直面临着很多问题来解决它。我已经在互联网上尝试了很多关于这个主题的教程,但没有一个适合我。
我正在编写的代码使用 python 在 ArcGIS 中自动执行一系列任务。在代码 运行 并获得所有平均值之后,我需要将光栅文件中的平均值与两个字符串连接在一起。
我已经尝试将我需要的所有信息加入一个数组中,但是当我尝试将其保存到 CSV 文件时遇到问题。
代码如下
#Interpolation
arcpy.gp.Idw_sa(out_Layer_shp, i_dia, arcpy.env.workspace + "\Raster\" + out_Layer_tif + ".tif", tamanho_celula, potencia_idw, "VARIABLE 12 12", "")
#Deleting the shape file
arcpy.Delete_management(out_Layer_shp, "")
lista_final = np.array([], dtype = object) #Final list
contador = 0 #Counter
for mascara in bacias: #Importing shapefiles to clip the interpolated raster
importar_camada = arcpy.env.workspace + "\Shapefile\Bacias\" + mascara + ".shp"
arcpy.MakeFeatureLayer_management(importar_camada, mascara)
#Variable to set the name of the layers that will be created and then clipped
camada_para_recortar = out_Layer_tif + ".tif"
camada_resultante = out_Layer + "_recortada"
nome_do_raster = camada_resultante + "_" + mascara + ".tif"
#Code to interpolate
arcpy.Clip_management(camada_para_recortar, "", arcpy.env.workspace + "\Raster\Recortes\" + camada_resultante + "_" + mascara + ".tif", mascara, "-3,402823e+038", "ClippingGeometry", "NO_MAINTAIN_EXTENT")
#Getting the mean value from the raster clipped
media = arcpy.GetRasterProperties_management (nome_do_raster, "MEAN", "")
lista_strings = np.array([out_Layer, mascara]) #array string
lista_medias = np.array([media]) #float string
arquivo_com_as_medias = "medias 01" #Name of the file to save the means values
lista_numpy_temporaria = np.array([out_Layer, mascara, media], dtype = object) #Temporary list to save the data before
#it be added to the final array
#lista_numpy_temporaria = lista_numpy_temporaria.reshape(1,3)
lista_final = np.concatenate((lista_final, lista_numpy_temporaria)) #Concatenating the two arrays
contador = contador + 1 #Incrementing the counter
lista_final = lista_final.reshape(contador,3) #reshape the final array
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", lista_final, fmt="%10s %10.3f", delimiter=";", header = "#1, #2")
#Attempt to write the arrays based in a tutorial that I found, but it didn't work
"""
ab = np.zeros(lista_numpy_temporaria.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = lista_strings
ab['var2'] = lista_medias
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", ab, fmt="%10s %10.3f")
"""
print(lista_final)
我从这段代码中得到的错误信息如下
Runtime error
Traceback (most recent call last):
File "", line 50, in
File "C:\Python27\ArcGIS10.3\lib\site-packages\numpy\lib\npyio.py", line 1031, in savetxt
raise error
ValueError: fmt has wrong number of % formats: %10s %10.3f
代码有很多评论,因为我一直在做很多尝试。
我的目标是得到一个包含 3 列和很多行的 CSV 文件,行数将根据插入的数据量而变化。一个示例如下:
RASTER FILE SUB_BASIN MEAN_VALUE
out_Layer mascara 99.99
谢谢。
编辑 1
建议解决后的新消息错误如下:
Runtime error Traceback (most recent call last): File "",
line 210, in File
"C:\Python27\ArcGIS10.3\lib\site-packages\numpy\lib\npyio.py", line
1047, in savetxt
fh.write(asbytes(format % tuple(row) + newline)) TypeError: float argument required, not Result
我找到的解决方案是将格式从 fmt="%10s %10s %10.3f" 更改为这个
fmt="%10s %10s %10s"
尽管这不是最好的解决方案,因为它 return 数字作为字符串。
我使用的完整代码如下。
import arcpy
import numpy as np
from arcpy import sa
from arcpy.sa import *
from calendar import monthrange
# Set environment settings
arcpy.env.workspace = "C:\Projetos\ArcGIS\Teste9"
arcpy.env.overwriteOutput = True
#get the map document
mxd = arcpy.mapping.MapDocument("CURRENT")
#get the data frame
df = arcpy.mapping.ListDataFrames(mxd,"la*")[0]
#Months and years to interpolate
mes = ["2"] #Months
ano = ["1994"] #Years
#Days to interpolate based in the month lenght
coluna_interpolada_28 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28"]
coluna_interpolada_29 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29"]
coluna_interpolada_30 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30"]
coluna_interpolada_31 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31"]
#Interpolation extent
arcpy.env.extent = arcpy.env.workspace + "\Shapefile\" + "PB.shp"
#Final list
lista_final = np.array([], dtype = object)
#Counter that is going to be used to reshape the arrays
contador = 0
#Loop to go through the time series
for i_ano in ano: #For loop with the years
for i_mes in mes: #For loop with the months
#Month Range
quantidade_dias = monthrange(int(i_ano), int(i_mes))
#If clauses to define which columns it is goin to interpolate
if quantidade_dias == (1, 28):
coluna_interpolada = coluna_interpolada_28
elif quantidade_dias == (1, 29):
coluna_interpolada = coluna_interpolada_29
elif quantidade_dias == (1, 30):
coluna_interpolada = coluna_interpolada_30
else:
coluna_interpolada = coluna_interpolada_31
#For loop with the days
for i_dia in coluna_interpolada:
tabela = i_mes + "_" + i_ano #Exemplo "2_1994"
in_Table = arcpy.env.workspace + "\Dados\" + tabela + ".csv" #Exemplo "2_1994.csv"
x_coords = "LONG"
y_coords = "LAT"
z_coords = "POINT_Z"
out_Layer = "espacializacao" + "_" + tabela + "_" + i_dia #nome da camada "lyr" que vai ser criada
#NOME DO ARQUIVO QUE VAI SER SALVO. Exemplo "espacializacao_2_1994_D2"
out_Layer_shp = out_Layer + "_shp" #nome da camada "shp" que vai ser criada
out_Layer_tif = out_Layer + "_tif"
tamanho_celula = "0,10" #precisar por as aspas, apesar de ser um número
potencia_idw = "2" #precisa por as aspas, apesar de ser um número
raio_de_busca = RadiusVariable(12, 12) #Critério para fazer a interpolação, raio variando até 12 quilômetros até conseguir englobar 12 pontos
# Set the spatial reference
spRef = arcpy.SpatialReference("WGS 1984")
#Create event layer
arcpy.MakeXYEventLayer_management(in_Table, x_coords, y_coords, out_Layer, spRef, "")
#Exporting event layer as shapefile
arcpy.FeatureToPoint_management(out_Layer, arcpy.env.workspace + "\" + "Shapefile\Exportados\" + out_Layer_shp + ".shp","")
#Layer that is going to be deleted "lyr"
lyr = arcpy.mapping.ListLayers(mxd, "espacializacao",df)
#Deleting the layer
for df in arcpy.mapping.ListDataFrames(mxd):
for lyr in arcpy.mapping.ListLayers(mxd, "", df): #O parâmetro que não foi passado foi o WildCard, não precisa
if lyr.name == out_Layer:
arcpy.mapping.RemoveLayer(df, lyr) #Removendo a camada da paleta lateral
#Some variables to define some parameters to the software
camada_editando = out_Layer_shp
coluna_criada = "Media"
tipo_campo = "FLOAT"
precisao_campo = ""
precisao_decimais = ""
comprimento_campo = 50 #Tamanho qualquer suposto
arcpy.AddField_management(camada_editando, coluna_criada, "LONG", precisao_campo,
precisao_decimais, comprimento_campo, "", "NULLABLE",
"NON_REQUIRED", "")
bacias = ["Abiai", "Camaratuba", "Curimatau", "Gramame", "Guaju", "Jacu", "Mamanguape", "Miriri", "Paraiba", "Piranhas", "Trairi"]
#Code to interpolate
arcpy.gp.Idw_sa(out_Layer_shp, i_dia, arcpy.env.workspace + "\Raster\" + out_Layer_tif + ".tif", tamanho_celula, potencia_idw, "VARIABLE 12 12", "")
#Deleting shapefile
arcpy.Delete_management(out_Layer_shp, "")
#For loop to clip the raster file using the shapefiles
for mascara in bacias:
importar_camada = arcpy.env.workspace + "\Shapefile\Bacias\" + mascara + ".shp" #Importing shapefile to clip
arcpy.MakeFeatureLayer_management(importar_camada, mascara)
#Some variables defining some parameters to using in the clip function
camada_para_recortar = out_Layer_tif + ".tif"
camada_resultante = out_Layer + "_recortada"
nome_do_raster = camada_resultante + "_" + mascara + ".tif"
#Function to clip the raster file
arcpy.Clip_management(camada_para_recortar, "", arcpy.env.workspace + "\Raster\Recortes\" + camada_resultante + "_" + mascara + ".tif", mascara, "-3,402823e+038", "ClippingGeometry", "NO_MAINTAIN_EXTENT")
media = arcpy.GetRasterProperties_management (nome_do_raster, "MEAN", "")
lista_strings = np.array([out_Layer, mascara])
lista_medias = np.array([media])
#Name of the file to save the means values
arquivo_com_as_medias = "medias 01"
lista_numpy_temporaria = np.append(lista_strings, lista_medias)
lista_final = np.concatenate((lista_final, lista_numpy_temporaria))
#Deleting the raster clipped
arcpy.Delete_management(nome_do_raster, "")
#Counter
contador = contador + 1
print(lista_final)
#Reshaping the file
lista_final = lista_final.reshape(contador,3)
print(lista_final)
#Saving the arrays to a CSV file
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", lista_final, fmt="%10s %10s %10s", delimiter=";", header = "")
#Deleting the original raster
arcpy.Delete_management(out_Layer_tif + ".tif", "")
使用上面的代码,"print(lista_final)" return 如下:
>>> print(lista_final)
[[u'espacializacao_2_1994_D1' u'Abiai' u'111,81740045547']
[u'espacializacao_2_1994_D1' u'Camaratuba' u'328,11316935221']
[u'espacializacao_2_1994_D1' u'Curimatau' u'273,3234489704']
[u'espacializacao_2_1994_D1' u'Gramame' u'223,45285224915']
[u'espacializacao_2_1994_D1' u'Guaju' u'393,62130737305']
[u'espacializacao_2_1994_D1' u'Jacu' u'312,91506958008']
[u'espacializacao_2_1994_D1' u'Mamanguape' u'289,06595204671']
[u'espacializacao_2_1994_D1' u'Miriri' u'564,86507415771']
[u'espacializacao_2_1994_D1' u'Paraiba' u'330,80016106998']
[u'espacializacao_2_1994_D1' u'Piranhas' u'328,95194289264']
[u'espacializacao_2_1994_D1' u'Trairi' u'333,04579162598']]
我在想的另一件事是,这是将这些输出写入 CSV 文件的最佳方法吗?因为我已经看到一些使用 "CSV module" 直接写入 CSV 文件的教程。但是,我已经试过了,没有成功。
我这么说是因为这段代码将被重复很多次,大约 19.000 次。因为我用它来插入 54 年时间序列中的每日降雨数据。所以,我想这个大小的数组不是解决这个问题的好方法。
再次感谢您。
编辑 2
我尝试了您的建议,但仍然无法正常工作。我所做的更改是
#First attempt
one = np.array([out_Layer], dtype = object)
two = np.array([mascara], dtype = object)
three = np.array([media])
rarr = np.rec.fromarrays([one, two, three])
arquivo_com_as_medias = "medias 01" #File with the means values
csv_directory = arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv"
np.savetxt(csv_directory, rarr, fmt=['%s', '%s', '%f'], delimiter=";")
现在显示的错误信息如下
Runtime error Traceback (most recent call last): File "",
line 176, in File
"C:\Python27\ArcGIS10.3\lib\site-packages\numpy\core\records.py", line
560, in fromarrays
raise ValueError("array-shape mismatch in array %d" % k) ValueError: array-shape mismatch in array 2
第176行的代码是
rarr = np.rec.fromarrays([one, two, three])
至少就您遇到的错误而言,就像它说的那样:您试图输出 3 列,但只提供了两种格式。如果您将 fmt
arg 更改为 fmt=['%10s', '%10s', '%10.3f']
之类的内容,那么 np.savetxt
应该可以工作。
您可能会 运行 出现其他错误,例如与您尝试保存的数组的 format/contents 有关的错误。为了避免任何此类潜在错误,您可能还想在脚本中临时添加一行,例如:
print(lista_final[:100])
就在 np.savetxt
行之前。这样,在尝试通过 savetxt
.[=22 处理数组之前,您可以确保 lista_final
的内容(至少在前一百行)实际上是您期望的内容=]
编辑
当您在代码末尾附近调用 np.concatenate((lista_final, lista_numpy_temporaria))
时,您最终会将所有 3 列强制放入一个标准 Numpy 数组中。标准数组只能有一个 dtype
,因此所有内容(包括最后一列中的浮点数)最终都会转换为字符串。您可以通过将您的列连接到一个记录数组中来避免这种情况(每个列可以有不同的数据类型)。假设您要在脚本末尾合并的三列数组如下所示:
one = np.array(["u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'"], dtype=object)
two = np.array(["u'Abiai'", "u'Camaratuba'", "u'Curimatau'", "u'Gramame'",
"u'Guaju'", "u'Jacu'", "u'Mamanguape'", "u'Miriri'", "u'Paraiba'",
"u'Piranhas'", "u'Trairi'"], dtype=object)
three = np.array([111.81740046, 328.11316935, 273.32344897, 223.45285225,
393.62130737, 312.91506958, 289.06595205, 564.86507416,
330.80016107, 328.95194289, 333.04579163])
然后您可以将它们连接到一个记录数组中,然后将它们写入 csv
文件,如下所示:
rarr = np.rec.fromarrays([one, two, three])
np.savetxt('arcgis.csv', rarr, fmt=['%s', '%s', '%f'], delimiter=";")
我找到的解决方案是使用 CSV 文件读写库。
我只是在开头添加了库 "import csv" 然后在代码中添加了以下几行。
首先,在开始的时候,我需要设置文件目录来保存数据。
#Opening the file to save the data
write_path = main_directory + "\Dados\Exportados\" + "file_name" + ".csv"
file = open(write_path, 'a')
writer = csv.writer(file)
'a' 参数允许您追加到文件末尾
然后,在我希望保存数据的步骤中,我添加了以下行:
#Writing to the file
writer.writerow([mes_pelo_nome, ano_pelo_nome, dia_pelo_nome, mascara, media])
最后,我添加了以下行来关闭文件:
file.close()
我一直在尝试连接两个数组(字符串数组和浮点数组),然后将最终数组写入 CSV 文件。但是,我一直面临着很多问题来解决它。我已经在互联网上尝试了很多关于这个主题的教程,但没有一个适合我。
我正在编写的代码使用 python 在 ArcGIS 中自动执行一系列任务。在代码 运行 并获得所有平均值之后,我需要将光栅文件中的平均值与两个字符串连接在一起。
我已经尝试将我需要的所有信息加入一个数组中,但是当我尝试将其保存到 CSV 文件时遇到问题。
代码如下
#Interpolation
arcpy.gp.Idw_sa(out_Layer_shp, i_dia, arcpy.env.workspace + "\Raster\" + out_Layer_tif + ".tif", tamanho_celula, potencia_idw, "VARIABLE 12 12", "")
#Deleting the shape file
arcpy.Delete_management(out_Layer_shp, "")
lista_final = np.array([], dtype = object) #Final list
contador = 0 #Counter
for mascara in bacias: #Importing shapefiles to clip the interpolated raster
importar_camada = arcpy.env.workspace + "\Shapefile\Bacias\" + mascara + ".shp"
arcpy.MakeFeatureLayer_management(importar_camada, mascara)
#Variable to set the name of the layers that will be created and then clipped
camada_para_recortar = out_Layer_tif + ".tif"
camada_resultante = out_Layer + "_recortada"
nome_do_raster = camada_resultante + "_" + mascara + ".tif"
#Code to interpolate
arcpy.Clip_management(camada_para_recortar, "", arcpy.env.workspace + "\Raster\Recortes\" + camada_resultante + "_" + mascara + ".tif", mascara, "-3,402823e+038", "ClippingGeometry", "NO_MAINTAIN_EXTENT")
#Getting the mean value from the raster clipped
media = arcpy.GetRasterProperties_management (nome_do_raster, "MEAN", "")
lista_strings = np.array([out_Layer, mascara]) #array string
lista_medias = np.array([media]) #float string
arquivo_com_as_medias = "medias 01" #Name of the file to save the means values
lista_numpy_temporaria = np.array([out_Layer, mascara, media], dtype = object) #Temporary list to save the data before
#it be added to the final array
#lista_numpy_temporaria = lista_numpy_temporaria.reshape(1,3)
lista_final = np.concatenate((lista_final, lista_numpy_temporaria)) #Concatenating the two arrays
contador = contador + 1 #Incrementing the counter
lista_final = lista_final.reshape(contador,3) #reshape the final array
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", lista_final, fmt="%10s %10.3f", delimiter=";", header = "#1, #2")
#Attempt to write the arrays based in a tutorial that I found, but it didn't work
"""
ab = np.zeros(lista_numpy_temporaria.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = lista_strings
ab['var2'] = lista_medias
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", ab, fmt="%10s %10.3f")
"""
print(lista_final)
我从这段代码中得到的错误信息如下
Runtime error Traceback (most recent call last): File "", line 50, in File "C:\Python27\ArcGIS10.3\lib\site-packages\numpy\lib\npyio.py", line 1031, in savetxt raise error ValueError: fmt has wrong number of % formats: %10s %10.3f
代码有很多评论,因为我一直在做很多尝试。
我的目标是得到一个包含 3 列和很多行的 CSV 文件,行数将根据插入的数据量而变化。一个示例如下:
RASTER FILE SUB_BASIN MEAN_VALUE
out_Layer mascara 99.99
谢谢。
编辑 1
建议解决后的新消息错误如下:
Runtime error Traceback (most recent call last): File "", line 210, in File "C:\Python27\ArcGIS10.3\lib\site-packages\numpy\lib\npyio.py", line 1047, in savetxt fh.write(asbytes(format % tuple(row) + newline)) TypeError: float argument required, not Result
我找到的解决方案是将格式从 fmt="%10s %10s %10.3f" 更改为这个
fmt="%10s %10s %10s"
尽管这不是最好的解决方案,因为它 return 数字作为字符串。
我使用的完整代码如下。
import arcpy
import numpy as np
from arcpy import sa
from arcpy.sa import *
from calendar import monthrange
# Set environment settings
arcpy.env.workspace = "C:\Projetos\ArcGIS\Teste9"
arcpy.env.overwriteOutput = True
#get the map document
mxd = arcpy.mapping.MapDocument("CURRENT")
#get the data frame
df = arcpy.mapping.ListDataFrames(mxd,"la*")[0]
#Months and years to interpolate
mes = ["2"] #Months
ano = ["1994"] #Years
#Days to interpolate based in the month lenght
coluna_interpolada_28 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28"]
coluna_interpolada_29 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29"]
coluna_interpolada_30 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30"]
coluna_interpolada_31 = ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31"]
#Interpolation extent
arcpy.env.extent = arcpy.env.workspace + "\Shapefile\" + "PB.shp"
#Final list
lista_final = np.array([], dtype = object)
#Counter that is going to be used to reshape the arrays
contador = 0
#Loop to go through the time series
for i_ano in ano: #For loop with the years
for i_mes in mes: #For loop with the months
#Month Range
quantidade_dias = monthrange(int(i_ano), int(i_mes))
#If clauses to define which columns it is goin to interpolate
if quantidade_dias == (1, 28):
coluna_interpolada = coluna_interpolada_28
elif quantidade_dias == (1, 29):
coluna_interpolada = coluna_interpolada_29
elif quantidade_dias == (1, 30):
coluna_interpolada = coluna_interpolada_30
else:
coluna_interpolada = coluna_interpolada_31
#For loop with the days
for i_dia in coluna_interpolada:
tabela = i_mes + "_" + i_ano #Exemplo "2_1994"
in_Table = arcpy.env.workspace + "\Dados\" + tabela + ".csv" #Exemplo "2_1994.csv"
x_coords = "LONG"
y_coords = "LAT"
z_coords = "POINT_Z"
out_Layer = "espacializacao" + "_" + tabela + "_" + i_dia #nome da camada "lyr" que vai ser criada
#NOME DO ARQUIVO QUE VAI SER SALVO. Exemplo "espacializacao_2_1994_D2"
out_Layer_shp = out_Layer + "_shp" #nome da camada "shp" que vai ser criada
out_Layer_tif = out_Layer + "_tif"
tamanho_celula = "0,10" #precisar por as aspas, apesar de ser um número
potencia_idw = "2" #precisa por as aspas, apesar de ser um número
raio_de_busca = RadiusVariable(12, 12) #Critério para fazer a interpolação, raio variando até 12 quilômetros até conseguir englobar 12 pontos
# Set the spatial reference
spRef = arcpy.SpatialReference("WGS 1984")
#Create event layer
arcpy.MakeXYEventLayer_management(in_Table, x_coords, y_coords, out_Layer, spRef, "")
#Exporting event layer as shapefile
arcpy.FeatureToPoint_management(out_Layer, arcpy.env.workspace + "\" + "Shapefile\Exportados\" + out_Layer_shp + ".shp","")
#Layer that is going to be deleted "lyr"
lyr = arcpy.mapping.ListLayers(mxd, "espacializacao",df)
#Deleting the layer
for df in arcpy.mapping.ListDataFrames(mxd):
for lyr in arcpy.mapping.ListLayers(mxd, "", df): #O parâmetro que não foi passado foi o WildCard, não precisa
if lyr.name == out_Layer:
arcpy.mapping.RemoveLayer(df, lyr) #Removendo a camada da paleta lateral
#Some variables to define some parameters to the software
camada_editando = out_Layer_shp
coluna_criada = "Media"
tipo_campo = "FLOAT"
precisao_campo = ""
precisao_decimais = ""
comprimento_campo = 50 #Tamanho qualquer suposto
arcpy.AddField_management(camada_editando, coluna_criada, "LONG", precisao_campo,
precisao_decimais, comprimento_campo, "", "NULLABLE",
"NON_REQUIRED", "")
bacias = ["Abiai", "Camaratuba", "Curimatau", "Gramame", "Guaju", "Jacu", "Mamanguape", "Miriri", "Paraiba", "Piranhas", "Trairi"]
#Code to interpolate
arcpy.gp.Idw_sa(out_Layer_shp, i_dia, arcpy.env.workspace + "\Raster\" + out_Layer_tif + ".tif", tamanho_celula, potencia_idw, "VARIABLE 12 12", "")
#Deleting shapefile
arcpy.Delete_management(out_Layer_shp, "")
#For loop to clip the raster file using the shapefiles
for mascara in bacias:
importar_camada = arcpy.env.workspace + "\Shapefile\Bacias\" + mascara + ".shp" #Importing shapefile to clip
arcpy.MakeFeatureLayer_management(importar_camada, mascara)
#Some variables defining some parameters to using in the clip function
camada_para_recortar = out_Layer_tif + ".tif"
camada_resultante = out_Layer + "_recortada"
nome_do_raster = camada_resultante + "_" + mascara + ".tif"
#Function to clip the raster file
arcpy.Clip_management(camada_para_recortar, "", arcpy.env.workspace + "\Raster\Recortes\" + camada_resultante + "_" + mascara + ".tif", mascara, "-3,402823e+038", "ClippingGeometry", "NO_MAINTAIN_EXTENT")
media = arcpy.GetRasterProperties_management (nome_do_raster, "MEAN", "")
lista_strings = np.array([out_Layer, mascara])
lista_medias = np.array([media])
#Name of the file to save the means values
arquivo_com_as_medias = "medias 01"
lista_numpy_temporaria = np.append(lista_strings, lista_medias)
lista_final = np.concatenate((lista_final, lista_numpy_temporaria))
#Deleting the raster clipped
arcpy.Delete_management(nome_do_raster, "")
#Counter
contador = contador + 1
print(lista_final)
#Reshaping the file
lista_final = lista_final.reshape(contador,3)
print(lista_final)
#Saving the arrays to a CSV file
np.savetxt(arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv", lista_final, fmt="%10s %10s %10s", delimiter=";", header = "")
#Deleting the original raster
arcpy.Delete_management(out_Layer_tif + ".tif", "")
使用上面的代码,"print(lista_final)" return 如下:
>>> print(lista_final) [[u'espacializacao_2_1994_D1' u'Abiai' u'111,81740045547'] [u'espacializacao_2_1994_D1' u'Camaratuba' u'328,11316935221'] [u'espacializacao_2_1994_D1' u'Curimatau' u'273,3234489704'] [u'espacializacao_2_1994_D1' u'Gramame' u'223,45285224915'] [u'espacializacao_2_1994_D1' u'Guaju' u'393,62130737305'] [u'espacializacao_2_1994_D1' u'Jacu' u'312,91506958008'] [u'espacializacao_2_1994_D1' u'Mamanguape' u'289,06595204671'] [u'espacializacao_2_1994_D1' u'Miriri' u'564,86507415771'] [u'espacializacao_2_1994_D1' u'Paraiba' u'330,80016106998'] [u'espacializacao_2_1994_D1' u'Piranhas' u'328,95194289264'] [u'espacializacao_2_1994_D1' u'Trairi' u'333,04579162598']]
我在想的另一件事是,这是将这些输出写入 CSV 文件的最佳方法吗?因为我已经看到一些使用 "CSV module" 直接写入 CSV 文件的教程。但是,我已经试过了,没有成功。
我这么说是因为这段代码将被重复很多次,大约 19.000 次。因为我用它来插入 54 年时间序列中的每日降雨数据。所以,我想这个大小的数组不是解决这个问题的好方法。
再次感谢您。
编辑 2
我尝试了您的建议,但仍然无法正常工作。我所做的更改是
#First attempt
one = np.array([out_Layer], dtype = object)
two = np.array([mascara], dtype = object)
three = np.array([media])
rarr = np.rec.fromarrays([one, two, three])
arquivo_com_as_medias = "medias 01" #File with the means values
csv_directory = arcpy.env.workspace + "\Dados\Exportados\" + arquivo_com_as_medias + ".csv"
np.savetxt(csv_directory, rarr, fmt=['%s', '%s', '%f'], delimiter=";")
现在显示的错误信息如下
Runtime error Traceback (most recent call last): File "", line 176, in File "C:\Python27\ArcGIS10.3\lib\site-packages\numpy\core\records.py", line 560, in fromarrays raise ValueError("array-shape mismatch in array %d" % k) ValueError: array-shape mismatch in array 2
第176行的代码是
rarr = np.rec.fromarrays([one, two, three])
至少就您遇到的错误而言,就像它说的那样:您试图输出 3 列,但只提供了两种格式。如果您将 fmt
arg 更改为 fmt=['%10s', '%10s', '%10.3f']
之类的内容,那么 np.savetxt
应该可以工作。
您可能会 运行 出现其他错误,例如与您尝试保存的数组的 format/contents 有关的错误。为了避免任何此类潜在错误,您可能还想在脚本中临时添加一行,例如:
print(lista_final[:100])
就在 np.savetxt
行之前。这样,在尝试通过 savetxt
.[=22 处理数组之前,您可以确保 lista_final
的内容(至少在前一百行)实际上是您期望的内容=]
编辑
当您在代码末尾附近调用 np.concatenate((lista_final, lista_numpy_temporaria))
时,您最终会将所有 3 列强制放入一个标准 Numpy 数组中。标准数组只能有一个 dtype
,因此所有内容(包括最后一列中的浮点数)最终都会转换为字符串。您可以通过将您的列连接到一个记录数组中来避免这种情况(每个列可以有不同的数据类型)。假设您要在脚本末尾合并的三列数组如下所示:
one = np.array(["u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'", "u'espacializacao_2_1994_D1'",
"u'espacializacao_2_1994_D1'"], dtype=object)
two = np.array(["u'Abiai'", "u'Camaratuba'", "u'Curimatau'", "u'Gramame'",
"u'Guaju'", "u'Jacu'", "u'Mamanguape'", "u'Miriri'", "u'Paraiba'",
"u'Piranhas'", "u'Trairi'"], dtype=object)
three = np.array([111.81740046, 328.11316935, 273.32344897, 223.45285225,
393.62130737, 312.91506958, 289.06595205, 564.86507416,
330.80016107, 328.95194289, 333.04579163])
然后您可以将它们连接到一个记录数组中,然后将它们写入 csv
文件,如下所示:
rarr = np.rec.fromarrays([one, two, three])
np.savetxt('arcgis.csv', rarr, fmt=['%s', '%s', '%f'], delimiter=";")
我找到的解决方案是使用 CSV 文件读写库。
我只是在开头添加了库 "import csv" 然后在代码中添加了以下几行。
首先,在开始的时候,我需要设置文件目录来保存数据。
#Opening the file to save the data
write_path = main_directory + "\Dados\Exportados\" + "file_name" + ".csv"
file = open(write_path, 'a')
writer = csv.writer(file)
'a' 参数允许您追加到文件末尾
然后,在我希望保存数据的步骤中,我添加了以下行:
#Writing to the file
writer.writerow([mes_pelo_nome, ano_pelo_nome, dia_pelo_nome, mascara, media])
最后,我添加了以下行来关闭文件:
file.close()