Python中如何判断写入生成的文件是否为二进制文件类型?
问题说明
我需要发起API调用获取二进制类型的JSON数据,当前代码的文件写入部分参考了两篇Stack Overflow技术帖,现有两个疑问:
- 下述两段代码生成的文件中,哪个存储的是二进制格式的JSON数据?
- 已知文件打开模式
wb为二进制写入模式,但不确定两个生成的文件是否均为二进制格式,有什么可行方法可以验证文件是否为二进制格式?
我是Python开发与API调用方向的初学者,感谢各位的帮助。
基础请求实现代码
import requests url = "https://covid-api.com/api/regions?iso=chn" payload={} headers = {} response = requests.request("GET", url, headers=headers, data=payload)
写入方案1:使用Pickle模块
import pickle with open("file.pkl","wb") as f: pickle.dump(response.content, f)
写入方案2:使用JSON模块
import json with open("file.json","wb") as f: f.write(response.content)
解答
核心结论
两个文件本质都是二进制字节流存储,但只有file.json存储的是通用可解析的二进制格式JSON数据,file.pkl存储的是Pickle序列化后的Python私有格式对象,不属于二进制JSON文件。
原因说明
- 接口返回的
response.content本身就是API输出的原始二进制字节流,你调用的这个公开接口返回的就是UTF-8编码的JSON内容对应的字节数据。 - 所谓JSON模块的写入代码,虽然导入了
json但实际没有调用JSON的序列化方法,只是直接把接口返回的原始JSON字节流通过wb模式写入文件,最终生成的文件和接口返回的内容完全一致,所有支持JSON解析的工具、编程语言都能正常读取这个文件的内容。 - Pickle模块的写入代码,是把
response.content这个Python的bytes类型对象,用Python独有的Pickle序列化协议做了二次封装,生成的pkl文件只能通过Python的pickle.load方法反序列化读取,不属于通用格式。哪怕封装的原始内容是JSON字节,加了Pickle的格式头和结构标记后,就不能被识别为JSON文件了。 - 补充说明:不存在特殊的"专有二进制JSON"格式,日常提到的二进制存储的JSON,本质就是把JSON文本按UTF-8等编码转成字节流落盘,和普通文本模式写入的JSON文件内容没有本质区别,
wb模式只是避免Windows系统下自动修改换行符,不会改变内容本身的格式属性。
文件格式验证方法
方法1:文本编辑器直接打开
用系统自带记事本、VS Code等文本编辑器直接打开目标文件:
- 如果打开后能看到清晰的
{}包裹的键值对JSON结构,说明是标准JSON文件(本质是编码为二进制字节存储的文本内容) - 如果打开后大部分是乱码、不可识别的特殊符号,属于非文本类二进制格式
- 打开
file.pkl时会看到开头有特殊的Pickle格式标记,中间夹杂零散的JSON字符,整体结构混乱,无法直接识别为JSON。
方法2:代码校验
直接尝试用JSON模块加载文件,能正常解析的就是合法JSON文件,参考代码:
import json # 校验file.json with open("file.json", "rb") as f: try: json.load(f) print("file.json 是合法JSON格式文件") except Exception as e: print("file.json 不是合法JSON,错误:", e) # 校验file.pkl with open("file.pkl", "rb") as f: try: json.load(f) print("file.pkl 是合法JSON格式文件") except Exception as e: print("file.pkl 不是合法JSON,错误:", e)
运行后可以看到file.json能正常通过校验,file.pkl会抛出JSON解析错误。
内容的提问来源于stack exchange,提问作者biggboss2019
相关产品推荐
相关产品推荐

