我想从netCDF文件中读取几个变量并将它们输出到csv文件中。
netCDF文件命名为关注surfclim_a
surfclim_b
。
这些文件中包含几个变量。我想在每个文件中找到名为Mlail
和Mlaih
的2个变量,并将它们附加到一个单独的csv文件中。
为此我做了以下代码:
import netCDF4
from netCDF4 import Dataset
import os
import numpy as np
import csv
stations = ["a", "b"]
inbasedir = "/home/david/test_pals/PALS/sites/"
varname = "surfclim_"
for station in stations:
os.chdir(inbasedir)
data = Dataset( varname + station + ".nc")
lail = (data.variables['Mlail'][:])
laih = (data.variables['Mlaih'][:])
a = (station + "_Lail,", lail)
b = (station + "_Laih,", laih)
table = a + b
print (table)
with open ('LAI.csv', 'w') as ofile:
writer = csv.writer(ofile)
[writer.writerow(r) for r in table]
它输出一个表,但不是附加每个站的值,我目前只是覆盖每个结果。
此外,输出文件不是我的预期:
b,_,L,a,i,l,","
[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]],[[ 0.0999756]]
有人为我提供任何提示或解决方案:
追加结果,而不是覆盖它们,
正确放置逗号b_Lail
而不是b,_,L,a,i,l,","
删除数字周围的括号
答案 0 :(得分:1)
1)您只需使用'a'
而不是'w'
打开csv文件即可添加而不是覆盖。
2)writer.writerow
函数需要一个iterable,所以当r
是你的站名时,它会将字符串视为一个可迭代的字符。
3)我无法重现您的括号问题,但您可能只是将数组转换为列表? (使用lail = list(lail)
)
另外,为了拥有格式正确的csv文件,我想你想要将站/变量名称放在与值列表相同的行上,不是吗? (假设所有阵列都具有相同的大小并且是1-D)
最后,您可以使用writer.writerows()
功能。根据我的建议,你的for循环可以变成:
for station in stations:
os.chdir(inbasedir)
data = Dataset( varname + station + ".nc")
lail = data.variables['Mlail'][:]
laih = data.variables['Mlaih'][:]
table = [[station + "_Lail", *lail],
[station + "_Laih", *laih]]
with open('LAI.csv', 'a') as ofile:
writer = csv.writer(ofile)
writer.writerows(table)
在这里,我使用了lail
和laih
的已加星标的解包,以便table
的每个元素都是一个列表,其中站/变量名中的第一个元素和所有其他元素都是值。
奖励:您可能还希望通过将所有内容附加到表并在将其写入文件之前对其进行转置来将它们写入列中。 (这是格式化csv文件的更合适的方法恕我直言,仍然假定所有数组都有1D和相同的大小。)
table = []
for station in stations:
os.chdir(inbasedir)
data = Dataset( varname + station + ".nc")
lail = data.variables['Mlail'][:]
laih = data.variables['Mlaih'][:]
table.append([station + "_Lail", *lail])
table.append([station + "_Laih", *laih])
table_t = list(map(list, zip(*table))) # Transposes the table
with open('LAI.csv', 'w') as ofile:
writer = csv.writer(ofile)
writer.writerows(table_t)