arcpy中中文路径的处理方案
(2017/2/20:这是我写的第一篇博客,没有什么经验,谨以此记录最近学习python的点滴;希望能为以后留下一些时光的记忆。)
最近再学习《面向ArcGIS的python脚本编程》一书,学习到第六章第五节(P119):”对列表使用for循环”时,发现一段对栅格数据进行批处理的代码非常有效,于是决定一试,原文代码如下:
这段代码可以实现将某个目录下的tiff格式图片一次性加载到ArcMap中,创建影像金字塔并打开,而我的电脑中:“C:\ArcGIS_test\测试用遥感影像”目录上刚好有100张tif格式的遥感影像,因此,我再IDLE中敲入上述代码块,将“env.workspace = ” 后面的路径换成我的路径“C:\ArcGIS_test\测试用遥感影像\J47F013048.tif”,为了防止arcpy不能识别中文路径,我还特意写成了“ u”C:\ArcGIS_test\测试用遥感影像” ”以便让编辑器能识别路径字符串中的中文。可是代码执行的结果却如下图:
代码报了一个错误:“ ‘NoneType’ object is not iterable”,这句报错是怎么回事呢?感觉应该和字符串中出现的中文字符有关,于是修改for的操作为:“print tiff.name”用以输出列表中的tif图片的名称,结果仍报上述错误:
百度报错内容,结果是:
于是想到肯定是列表中出现了空值None,而通过for语句将None不断的赋值给每一个tiff,因此报错,为了证明,执行代码“print tifflist”,结果如下:
说明tifflist这个列表中并没有值,也就是说arcpy.ListRasters(“”,”TIF”)这个函数并没有获取到工作空间目录下的图片内容,从而进一步断定应该是工作空间目录中出现中文字符的问题,于是,利用arcpy的Exists函数来判断一下工作空间目录下的tif图片是否存在。(catalog目录树中,“C:\ArcGIS_test\测试用遥感影像”目录下是客观存在99张tif图片的)
再将这张图片J47F013048.tiff直接复制到C:\ArcGIS_test目录下,并用Exists函数检测有无,结果如下:
由此可以看出,catalog这两个目录下的同名图片事实上都是客观存在的,但是一旦路径中出现中文,Exists函数就不能检测到图片的存在,说明Arcpy的确不能识别中文路径,证明了自己猜想的正确性,于是,再次百度Arcpy不能识别中文路径的解决方案,并在如下链接(http://www.xuebuyuan.com/412913.html)的文章中找到答案,下面转述一下该文章内容:
{
《ArcGIS 中 Python 汉字使用说明》
这里只针对ArcGIS中ArcToolbox中调用Python时使用汉字的情况。
1.如果实用的标准参数传入的方法,和字符串使用方法一样,没有什么特别之处。如:grouplayer_name = arcpy.GetParamenterAsText(0) #传入变量带汉字
判断相等时直接使用如下格式:
lyr.name == grouplayer_name
这里都是变量之间的操作,没有直接汉字的使用,ArcGIS默认使用unicode编码。
2.在程序中直接使用汉字字符串,这时必须使用编码转换,如Grouplayer_name == “图层组1”.decode(‘gb3212’)
这里的decode的作用是将其他编码的字符串转换成Unicode编码,表示将gb2312编码的字符串str1转换成Unicode编码。encode的作用是将Unicode编码转化成其他编码的字符串,表示将Unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码。
}
有该文章红字部分说的,只要将工作空间路径中出现的中文路径字符串后利用“.decode(“gb2312”)”进行转码应该就行了,于是使用这个方法重写上述代码进行测试:
说明该方法果然奏效,能让Exists函数正常识别出中文路径下的tif影像;为此,用该转码方法重写工作空间路径,并打印栅格列表,进行测试:
栅格列表也能被检测到,进一步说明转码方法有效,下面重新执行创建栅格影像金字塔的批处理操作,并检测结果:
高兴的太早了,又出现了上面这样的报错,百度一下,得到的解决方案差不多,在文件头利用sys.setdefaultencoding(“utf-8”)来解决,两个方法的百度来源如下:
再次重写代码,并在开始使用上述方法来尝试:果然不再报错:
终于解决了arcpy中使用中文路径不被识别的问题,但是,打开的ArcMap文档中并未像预想的那样加载入所有99张影像,利用arc.GetMessages()函数获取工具执行消息,也返回空内容,这说明arcpy.BuildPyramids_management()函数应该只是对栅格影像创建了金字塔,而不能将其加载到mxd中,关于这一猜测的正确性验证,将在我的第二篇博客中继续探寻。
转载自:https://blog.csdn.net/SuperGiser_Lee/article/details/56012714