Python实现对文件的读写操作


本文介绍如何使用Python对文件进行读写操作,以及相应的数据格式转换。

1 子函数

1.1 格式转换

实现单个数据16进制数与浮点数之间的格式转换。

def h2f(s): #16进制数转浮点数
  cp = ctypes.pointer(ctypes.c_long(s))
  fp = ctypes.cast(cp, ctypes.POINTER(ctypes.c_float))
  return fp.contents.value
def f2h(s): #浮点数转16进制数
  fp = ctypes.pointer(ctypes.c_float(s))
  cp = ctypes.cast(fp, ctypes.POINTER(ctypes.c_long))
  return hex(cp.contents.value)

实现数组所有元素浮点数转16进制,每个元素为复数。

def float2hex(data, length, hdata):
  for k in range(length):
    for j in range(length):
      for i in range(length):
        # 实部
        hdata_real = f2h(data[k,j,i].real)
        numb = len(hdata_real)
        hdata_real = hdata_real[2:numb]
        # 虚部
        hdata_imag = f2h(data[k,j,i].imag)
        numb = len(hdata_imag)
        hdata_imag = hdata_imag[2:numb]
        # 复数
        hdata[k,j,i] = hdata_imag+hdata_real

1.2 读普通文件

从文件中读出三维数组,数组中每个元素为复数。

def read_file(data, length, filename):
  with open(filename, 'r') as file:
    lines = file.readlines()
    k = j = cnt = 0
    for line in lines:
      j = int(cnt / length)
      if cnt >= length**2:
        k = k + 1
        cnt = 0
      else:
        cnt = cnt + length
      if line == '\n':
        continue
      values = line.split()
      for i in range(length):
        value = values[i].split('+')
        data[k,j,i] = complex(float(value[0]),float(value[1]))
  file.close

1.3 写coe文件

将三维数组写入coe文件,作为RAM或ROM的初始化文件,存储器位宽256位。

def write_coe(data, length, filename):
  pattern = [3,2,1,0]
  with open(filename, 'w') as file:
    file.write('memory_initialization_radix=16;\n')
    file.write('memory_initialization_vector=')
    cnt = 0
    for k in range(length):
      for i in range(length):
        for j in pattern:
          cnt = cnt + 1
          if (cnt==4):
            file.write(data[k,j,i]+' ')
            cnt = 0
          else:
            file.write(data[k,j,i])
  file.close

1.4 写bin文件

将三维数组写入bin文件中,作为Xilinx XDMA的写入文件。

def write_bin(data, length, filename):
  with open(filename, 'wb') as file:
    for k in range(length):
      for i in range(length):
        for j in range(length):
          value = data[k,j,i].real
          hdata = struct.pack('f',value) #按32位浮点转换
          file.write(hdata)
          value = data[k,j,i].imag
          hdata = struct.pack('f',value) #按32位浮点转换
          file.write(hdata)
  file.close

1.5 读bin文件

从Xilinx XDMA读出数据形成bin文件,从bin文件中读出三维数组。

def read_bin(data, length, filename):
  flag = 0
  fdata = []
  fid = open(filename, 'rb')
  while True:
    hdata = fid.read(4) #读4个字节的数据
    if len(hdata)==0:
      break
    value =  struct.unpack('f', hdata)
    if flag == 0:
      freal = round(value[0],3)
      flag = 1
    else:
      fimag = round(value[0],3)
      flag = 0
      fdata.append(complex(freal, fimag))
  cnt = 0
  for k in range(length):
    for i in range(length):
      for j in range(length):
        data[k,j,i] = fdata[cnt]
        cnt = cnt + 1

1.6 写普通文件

将三维数组写入不同文件中。

def write_file(data, length, filename):
  with open(filename, 'w') as file:
    for k in range(length):
      for j in range(length):
        for i in range(length):
          freal = data[k,j,i].real
          fimag = data[k,j,i].imag
          if fimag >= 0:
            file.write(str(freal)+'+'+str(fimag)+' ')
          else:
            file.write(str(freal)+str(fimag)+' ')
          if j == length-1 and i == length-1:
            file.write('\n')
          if i == length-1:
            file.write('\n')
  file.close

2 主函数

调用子函数实现文件读写和数据转换全过程。

length = 4
rdata = np.zeros((length,length,length),complex)
filename = 'rdata'
read_file(rdata, length, filename)

hdata = np.zeros((length,length,length),object)
float2hex(rdata, length, hdata)

filename = 'data.coe'
write_coe(hdata, length, filename)

filename = 'data.bin'
write_bin(rdata, length, filename)

wdata = np.zeros((length,length,length),complex)
read_bin(wdata, length, filename)

filename = 'wdata'
write_file(wdata, length, filename)

首先从rdata文件中读出数据,形成三维数组rdata。
在这里插入图片描述

然后将浮点数转换为16进制数,并写入data.coe文件中。
在这里插入图片描述
同时也将浮点数转换为16进制数写入data.bin文件中。
在这里插入图片描述
最后从data.bin中读出数据,进行格式转换后写入wdata文件中。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值