a 一直想弄一个bin文件。用来存p站拿来的图什么的 免得被别人看见。一直在想是不是 有对应的库可以用。

后来 发现其实这个东西很简单。可能是 我基础不牢吧。

基本思路是   

生成一个   size(文件大小)name(文件名)data(文件数据)     数据结构

这里的 size是一个10字节的前导0 字符串。 name是一个50字节等长的字符串。 

不等长也可以。稍微麻烦一点 这里就没有弄。

生成bin的代码

import sys
import os
import os.path

''' 处理一个文件
获得字节大小 名字  然后格式化为等长一个字符串  编码
写入文件  吧文件本体写入文件'''

def get_format_str(path, name):
    '''返回一个字符串  前面10字节是文件的size  后面50字节是文件的名字'''
    size = list(str(os.path.getsize(path + "\\" + name)))
    while len(size) < 10:
        size.insert(0, "0")  # 长度进行前导0

    root_name = ['\0' for i in range(0, 50)]
    for i in range(0, len(name)):
        root_name[i] = name[i]
    return ''.join(size + root_name)

def creatBinFilse(path=".",bin_name="fin"):
    file_name_list = os.listdir(path)
    fin = open(bin_name+".bin", "wb")  
    for name in file_name_list:
        str1 = get_format_str(path, name)
        fin.write(bytes(str1, "utf-8"))  # 文件相关信息 编码写入
        with open(path + "\\" + name, "rb") as f1:
            fin.write(f1.read())
    fin.close()


if __name__ == '__main__':
    creatBinFilse(path="1")

读取的代码

import sys;import os;import os.path
import re

def get_size_data(f1):
    return int(f1.read(10))

def get_name_data(f1):
    temp = f1.read(50).decode("utf-8")
    return re.search(".*?\0",temp).group()[:-1]


fin = open("fin.bin","rb")
the_fin_size = os.path.getsize("fin.bin")
while fin.tell()!= the_fin_size:
    size = get_size_data(fin)
    name = get_name_data(fin)
    data = fin.read(int(size))
    with open(name, "wb") as f1:
        f1.write(data)