[英]CSV to binary using Python
我有很多 csv 文件,我想将它们转换成二进制文件,所以我想创建一个 python 脚本来为我自动执行此任务。 我的 CSV 文件包含 0 或 255。(每个文件有 80 行和 320 列)
我写了这段代码:
import numpy as np
import csv
csv_filename = '320x80_ImageTest_1_255.csv'
filename = "output.bin"
with open(csv_filename) as f:
reader = csv.reader(f, delimiter =';')
lst = list(reader)
array = np.array(lst)
with open ('new_binary.bin','wb') as FileToWrite:
for i in range(len(array)):
for j in range(len(array[0])):
FileToWrite.write(''.join(chr(int(array[i][j]))).encode())
问题是 output 文件是这样的: output 文件的屏幕
但是我想要这个字符,它对应于十六进制的 255,我在哪里做错了什么? 有人能帮我吗?
你想要像下面这样的东西吗?
rows = [
["0", "0", "0", "0", "255", "255", "0", "0", "255"],
["255", "255", "0", "0", "0", "255", "0", "0", "255"],
["0", "255", "0", "0", "255", "0", "255", "0", "0"],
["0", "0", "255", "0", "0", "255", "0", "0", "0"],
]
with open("output.bin", "wb") as f_out:
for row in rows:
for field in row:
f_out.write(int(field).to_bytes())
然后,检查 output.bin:
with open("output.bin", "rb") as f_in:
while True:
x = f_in.read(9)
if len(x) == 0:
break
print(x)
b'\x00\x00\x00\x00\xff\xff\x00\x00\xff'
b'\xff\xff\x00\x00\x00\xff\x00\x00\xff'
b'\x00\xff\x00\x00\xff\x00\xff\x00\x00'
b'\x00\x00\xff\x00\x00\xff\x00\x00\x00'
感谢Writing integers in binary to file in python向我展示了to_bytes(...)
方法,感谢 MyICQ 指出了默认值。
这几乎完成了所描述的内容。
我省略了变量输入的读取,这应该是微不足道的。 由于输入包含'
字符,因此它不能被读取为 json。相反,我将其视为一系列数字,由某些东西分隔。 然后应用正则表达式将数字转换为数组。
# Regular expression support
import re
# the input, should be read from file
dirtyinput = "[['0;0;0;0;255;255;0;0;255], ['255;255;0;0;0;255;0;0;255], ['0;255;0;0;255;0;255;0;0], ['0;0;255;0;0;255;0;0;0]]"
# extract numbers
numbers = re.findall(r'\d+', dirtyinput)
# Using function from answer by Zach Young
with open("output.bin", "wb") as f_out:
for n in numbers:
f_out.write(int(n).to_bytes(1, 'big'))
# --------- another method, iterating the data (efficient if the data is large)
#
with open("output2.bin", "wb") as f:
for x in re.finditer(r'\d+', dirtyinput):
f.write(int(x.group()).to_bytes(1,'big'))
# -------- testing result
#
with open("output.bin", "rb") as f_in:
while True:
x = f_in.read(9)
if len(x) == 0:
break
print(x)
b'\x00\x00\x00\x00\xff\xff\x00\x00\xff'
b'\xff\xff\x00\x00\x00\xff\x00\x00\xff'
b'\x00\xff\x00\x00\xff\x00\xff\x00\x00'
b'\x00\x00\xff\x00\x00\xff\x00\x00\x00'
我得到与上面的答案相同的结果。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.