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文件中。