用Python转换LAZ到LAS时遇LaspyException无效文件签名错误
LAZ转LAS时部分文件报Invalid file signature错误
问题详情
使用Python批量转换.laz到.las文件时,06BN1可正常转换,但06BN2等其他文件触发LaspyException: Invalid file signature "b'\xca\x8d\xa0?'",修改文件名或单独执行转换均无法解决问题。
用到的代码
import os import laspy def laz_to_las(kaartbladen): for k in kaartbladen: file_path_laz = os.path.join('TEMP', str(k.upper()) + ".LAZ") file_path = os.path.join('TEMP', str(k.upper()) + ".LAS") if not os.path.exists(file_path): print("converting " + k) las = laspy.read(file_path_laz) las = laspy.convert(las) las.write(file_path) print("laz to las convert complete!") print("all maps converted") laz_to_las(["06BN1","06BN2","06BN2"])
完整报错信息
LaspyException Traceback (most recent call last) <ipython-input-2-4ea8b8d3235b> in <module> ----> 1 laz_to_laz(["06BN1","06BN2","06BN2"]) <ipython-input-1-91b572718729> in laz_to_las(kaartbladen) 91 if not os.path.exists(file_path): 92 print("converting " + k) ---> 93 las = laspy.read(file_path_laz) 94 las = laspy.convert(las) 95 las.write(file_path) ~\AppData\Roaming\Python\Python38\site-packages\laspy\lib.py in read_las(source, closefd, laz_backend) 185 The object you can interact with to get access to the LAS points & VLRs 186 """ --> 187 with open_las(source, closefd=closefd, laz_backend=laz_backend) as reader: 188 return reader.read() 189 ~\AppData\Roaming\Python\Python38\site-packages\laspy\lib.py in open_las(source, mode, closefd, laz_backend, header, do_compress, encoding_errors) 116 else: 117 stream = source --> 118 return LasReader(stream, closefd=closefd, laz_backend=laz_backend) 119 elif mode == "w": 120 if header is None: ~\AppData\Roaming\Python\Python38\site-packages\laspy\lasreader.py in __init__(self, source, closefd, laz_backend) 47 laz_backend = LazBackend.detect_available() 48 self.laz_backend = laz_backend ---> 49 self.header = LasHeader.read_from(source, read_evlrs=True) 50 51 if self.header.point_count > 0: ~\AppData\Roaming\Python\Python38\site-packages\laspy\header.py in read_from(cls, original_stream, read_evlrs) 531 header = cls() 532 --> 533 stream = io.BytesIO(cls._prefetch_header_data(original_stream)) 534 535 file_sig = stream.read(4) ~\AppData\Roaming\Python\Python38\site-packages\laspy\header.py in _prefetch_header_data(source) 851 raise LaspyException(f"Source is empty") 852 if file_sig != LAS_FILE_SIGNATURE: --> 853 raise LaspyException(f'Invalid file signature "{file_sig}"') 854 if len(header_bytes) < LAS_HEADERS_SIZE["1.1"]: 855 raise LaspyException("File is to small to be a valid LAS") LaspyException: Invalid file signature "b'\xca\x8d\xa0?'"
排查与解决方法
验证文件完整性
报错的LAZ文件可能存在下载不完整或损坏情况。用MD5/SHA1校验工具对比官方提供的文件校验值,重新下载损坏文件;也可直接用LASzip命令行工具尝试转换单个文件:laszip -i 06BN2.LAZ -o 06BN2.LAS,若命令行也报错,说明文件本身有问题。指定LAZ处理后端
Laspy依赖LASzip或lazrs处理压缩文件,部分特殊格式可能需要手动指定后端。修改代码中读取文件的部分:# 指定Laszip后端 las = laspy.read(file_path_laz, laz_backend=laspy.LazBackend.Laszip) # 或尝试lazrs后端 # las = laspy.read(file_path_laz, laz_backend=laspy.LazBackend.Lazrs)检查路径与权限
确认报错文件确实存在于TEMP目录,且文件名大小写与代码生成路径一致;同时确保Python进程有读取该目录文件的权限,避免因权限不足导致读取内容异常。更新Laspy版本
旧版本Laspy对部分LAZ格式支持有限,更新至最新版本:pip install --upgrade laspy[laszip](包含LASzip依赖)。
内容的提问来源于stack exchange,提问作者CedricS
相关产品推荐
相关产品推荐

