读取二进制文件会显示无法读取的字符

2024-10-04 09:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是二进制文件:

ftp://n5eil01u.ecs.nsidc.org/SAN/GLAS/GLA14.034/2003.02.28/GLA14_634_1102_002_0071_0_01_0001.DAT

我试着看那个文件:

fname = "GLA14_634_1102_002_0071_0_01_0001.DAT"
with open (fname, 'rb') as fi:
    lines = fi.read().splitlines()
    print len(lines)    
    print lines[-1]

行数“844514”似乎正确。在

但最后一行显示为不可读字符。在

我怎样才能正确地阅读它?在


Tags: 文件org二进制ftpfnamedatfiecs
3条回答

该文件似乎是一个混合文本和二进制文件。前20000个字节是文本,然后是一些二进制数据。文本部分似乎没有引用二进制数据的开头。所以我认为20000字节是固定的。在

所以你得到的文本部分是这样的:

TEXT_PART_SIZE = 20000

filename = "GLA14_634_1102_002_0071_0_01_0001.DAT"
with open(filename, 'rb') as data:
    text_lines = data.read(TEXT_PART_SIZE).strip().splitlines()

文本行提供一些元数据,也许是为了解码以下二进制数据。没有详细的描述是不可能读取这个二进制数据的。看起来,有15个数据集和200个单独的文件打包在一个大文件中。 在struct-模块和文件格式描述的帮助下,您可以轻松地读取这些文件。在

你正在处理GLA14 ICESat数据记录。有关字节结构的信息也可以在NSIDC(https://nsidc.org/data/docs/daac/glas_altimetry/gla14_records.html)找到。至于ascii文本头,每个人都认为长度是固定的。第一个字节的长度是,记录的长度是2万字节。在

简短示例文件的“最后一行”以以下字节开头:

In [49]: lines[-1][:20]
Out[49]: b'\x01\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

将其转换为int

^{pr2}$

lines[-1][1]上,168超出了ASCII的范围。在

如果要将此文件转换为可打印字符,则必须找出此文件中使用的编码。在

编辑:

如果您可以使用类UNIX的系统,那么可以使用^{}util(man page)。在

$ strings GLA14_634_1102_002_0071_0_01_0001.DAT | head -20
Recl=10000;
Numhead=2;
size_mb_ecs_data_granule=267.57240295410156;
time_between_contiguous_records=1;
instrument_short_name=GLAS;
platform_short_name=Icesat;
sensor_short_name=LaserAlt;
glas_osc_rate.1=1.000000028;
glas_osc_rate_date.1=2003-02-20;
glas_osc_rate_time.1=00:00:00;
sc_osc_rate.1=0.99999998864727;
sc_osc_rate_date.1=2003-02-20;
sc_osc_rate_time.1=00:00:00;
internal_time_delay.1=15.11;
internal_time_delay_date.1=2003-02-20;
internal_time_delay_time.1=00:00:00;
internal_range_delay.1=9556;
internal_range_delay_date.1=2003-02-20;
internal_range_delay_time.1=00:00:00;
ReprocessingPlanned=no further update anticipated;

相关问题 更多 >