python3利用base64编码生成随机文件
在测试某些功能的时候,我们可能需要用一些文件来作为测试的对象,利用python生成这些随机文件是不错的选择。虽然tempfile库已经有类似的功能了,但我还是想自己造一个轮子。
使用的库
- base64
- random
思路
-
无论是生成文件还是生成文件名,我们需要的都是一个合法的字符串(此处合法指不违背用途要求),而字符串可以看成一系列的二进制字节编码而成的对象,因此,我们需要一个大随机数以生成这个随机的字符串。
-
问题来了,这个大随机数应该怎么确定位长度呢?
这里要从base64编码的算法说起,base64是将每6( l o g 2 64 log_264 log264)个字节编码成8个字符的编码算法,也就是说,编码后会比编码前长 1 3 \frac 13 31,因此在生成长度的时候,我们要用目的长度的 3 4 \frac 34 43来计算随机数的比特长度。
-
文件名还有特殊的要求,比如不能含有"/",但base64有安全url的编码方法,选用就可以了。
话不多说,贴代码
代码
生成文件名
max_name_lenth = 8 # 递增4来决定长度
name = str(base64.urlsafe_b64encode(
random.randint(0, 2**(8*max_name_lenth//4*3)
).to_bytes(max_name_lenth//4*3, "little") # 大端和小端在生成随机文件的时候就随意就可以了
), "utf-8")
生成文本
max_content_lenth = 256 # 递增4来决定长度
content = str(base64.b64encode(
random.randint(0, 2**(max_content_lenth//4*3*8)
).to_bytes(max_content_lenth//4*3, "little")
), "utf-8")
完整代码
max_name_lenth = 8
name = str(base64.urlsafe_b64encode(
random.randint(0, 2**(8*max_name_lenth//4*3)
).to_bytes(max_name_lenth//4*3, "little")
), "utf-8")
path = "./"+name
print(path, len(name))
max_content_lenth = 256 # 递增4来决定长度
content = str(base64.b64encode(
random.randint(0, 2**(max_content_lenth//4*3*8)
).to_bytes(max_content_lenth//4*3, "little")
), "utf-8")
print(len(content))
with open(path+".txt", "a") as file:
file.write(content)