l11y22s33 2023-05-29 11:21 采纳率: 0%
浏览 9

python 使用read函数遇到的问题

我用Python读取二进制文件。
前面的代码使用.read()函数很顺利
read(4)这就是read4个字节的意思。
结果突然,再用read(4),就显示读取了7个字节。
read(2),就显示读取了4个字节。
这是为啥啊?

下面是全部代码
```python

#Source code for 
# -*- coding: utf-8 -*-

import abc#abc模块是AbsructBaseClass的缩写
'''

'''
import os
import json
from typing import Optional, Any
import bz2
import gzip

import numpy as np


from cinrad.constants import MODULE_DIR
from cinrad._typing import Number_T
import struct


# -*- coding: utf-8 -*-
# Author: Puyuan Du

from collections import OrderedDict, defaultdict
from typing import Optional, Union, Any
import datetime
from io import BytesIO

import numpy as np
from xarray import Dataset, DataArray


with open("/mnt/e/config/maps/Z9010_20230512080000Z_HCL_02_164", "r",encoding='ISO-8859-1') as buf:#os.path.join()用来拼接路径gb2312
   ###########################读公共数据块-通用头块32个字节

    #把指标放到8个字节之后
    buf.seek(8)#seek这个不具有累加意味是指针,但是read有累加
    #读取4个字节是公共数据块-通用头块-04文件类型
    a1=buf.read(4).encode()#必须由encode转码成bytes,直接读出来是str   
    print (a1)
    gt = int.from_bytes(a1, byteorder='little', signed=True) # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
    print(gt )

    #读取4个字节是公共数据块-通用头块-05产品类型。51代表HCL
    a2=buf.read(4).encode()
    print (a2)
    pt = int.from_bytes(a2, byteorder='little', signed=True) # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
    print(pt )
    
    ###########################读公共数据块-站点配置块128个字节
    buf.seek(32)#seek这个不具有累加意味是指针,但是read有累加
    #读取4个字节是公共数据块-站点配置-01站号。51代表HCL
    a3=buf.read(8).encode()
    print (a3)
    sc = str(a3,'utf-8') # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
    print(sc )
    
    
    #读取32个字节是公共数据块-站点配置-02站名。51代表HCL
    a4=buf.read(32).encode()
    
    print (a4)
    sn = str(a4,'utf-8') # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
    print(sn )
    
    #读取4个字节是公共数据块-站点配置-03纬度。51代表HCL
    a5=buf.read(4).encode()
    print (len(a5))

    print (a5)
    slat = struct.unpack('f',a5) 
    print(slat )    


    a6=buf.read(4).encode()#就是这里,读取4个显示7个,读取3个显示6个,读取2个显示4个。搞得我后面用不了。之前都很正常
    print (len(a6))
    print (type(a6))
    print (a6)
    slon =  struct.unpack('f',a6) 
    print(slon)    
    

```

  • 写回答

4条回答 默认 最新

  • 梦幻编织者 2023-05-29 11:42
    关注

    可能是因为文件中存在不可见字符或者换行符等特殊字符,导致读取的字节数不符合预期。建议使用二进制模式打开文件,即将文件打开方式改为"rb",并且使用struct.unpack()函数按照指定格式解析字节流。这样可以避免出现读取字节数不符合预期的情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月29日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22
  • ¥15 R语言中lasso回归报错