json은 C와 Python 등 언어 간 데이터 교환에 사용됩니다. Pickle은 Python과 Python 간의 데이터 교환에만 사용할 수 있습니다.
객체(변수)를 메모리에서 저장 가능하거나 전송 가능한 객체로 만드는 과정을 직렬화라고 합니다. Python에서는 피클링이라고 하며 다른 언어에서는 직렬화라고도 합니다. 같은 의미. 직렬화 후에는 직렬화된 콘텐츠를 디스크에 기록하거나 네트워크를 통해 다른 시스템으로 전송할 수 있습니다. 차례로, 직렬화된 객체의 변수 내용을 메모리로 다시 읽는 것을 역직렬화, 즉 역피클링이라고 합니다.
다른 프로그래밍 언어 간에 개체를 전송하려면 개체를 XML과 같은 표준 형식으로 직렬화해야 하지만 더 좋은 방법은 JSON으로 직렬화하는 것입니다. JSON은 문자열로 표현되고 모든 언어에서 사용할 수 있기 때문입니다. 읽고 디스크에 쉽게 저장하거나 네트워크를 통해 전송할 수 있습니다. JSON은 표준 형식이고 XML보다 빠를 뿐만 아니라 웹 페이지에서 직접 읽을 수도 있어 매우 편리합니다.
JSON으로 표현되는 객체는 표준 JavaScript 언어 객체입니다. JSON과 Python의 내장 데이터 유형 간의 대응은 다음과 같습니다.
파일에 데이터 쓰기 및 읽기 - 사전
dic =' {‘string1':'hello'}' #写文件只能写入字符串 - 手动把字典变成字符串 f = open(‘hello', ‘w') f.write(dic)
f_read = open(‘hello', ‘r') data = f_read.read() #从文件中读出的都是字符串 data = eval(data) #提取出字符串中的字典 print(data[‘name'])
json은 위를 구현합니다. 함수 - json을 사용할 수 있습니다. 어떤 언어로든 데이터를 전송하는 것에는 차이가 있습니다.
dic = {‘string1':'hello'} data = json.dumps(dic) print(data) print(type(data)) #dumps()会把我们的变量变成一个json字符串 f = open(“new_hello”, “w”) f.write(data)
json 문자열과 우리가 수동으로 추가하는 문자열은 json 문자열 사양을 따릅니다. 즉, 문자열이 안에 들어 있습니다. 큰 따옴표.
dumps는 우리가 전달하는 모든 데이터 유형을 큰따옴표로 묶인 문자열로 바꿉니다.
# {‘string1':'hello'} ---> “{“string1”:”hello”}” # 8 ---> “8” # ‘hello' ---> ““hello”” – 被json包装后的数据内部只能有双引号 #[1, 2] ---> “[1, 2]”
저장하거나 전송할 때 데이터를 json 문자열로 변환합니다. 이는 모든 언어로 구현될 수 있습니다.
f_read = open(“new_hello”, “r”) data = json.loads(f_read.read()) #这个data直接就是字典类型 print(data) print(type(data))
json.dumps() # 把数据包装成json字符串 – 序列化 json.loads() # 从json字符串中提取出原来的数据 – 反序列化
파이썬에서 l = [1, 2, 3] 목록을 json 문자열로 묶어 저장하거나 보냅니다. C 언어에서 json 구문 분석을 사용하면 해당 값을 C 언어로 가져옵니다. 데이터 구조가 추출됩니다. 배열 buf[3] = {1, 2, 3}으로.
이는 json 문자열이 json 사양을 준수하는 한 덤프와 로드를 함께 사용해야 한다는 의미는 아니며, 덤프 사용 여부는 중요하지 않습니다.
json.dump(data, f) #转换成json字符串并写入文件 #相当于 data = json.dumps(dic) + f.write(data) data = json.load(f) #先读取文件,再提取出数据 #相当于data = json.loads(f_read.read())
예:
#----------------------------序列化 import json dic={'name':'alvin','age':23,'sex':'male'} print(type(dic))#<class 'dict'> j=json.dumps(dic) print(type(j))#<class 'str'> f=open('序列化对象','w') f.write(j) #-------------------等价于json.dump(dic,f) f.close()
#-----------------------------反序列化<br> import json f=open('序列化对象') data=json.loads(f.read())# 等价于data=json.load(f)
참고:
import json #dct="{'1':111}"#json 不认单引号 #dct=str({"1":111})#报错,因为生成的数据还是单引号:{'one': 1} dct='{"1":"111"}' print(json.loads(dct))
데이터 생성 방법에 관계없이 json 형식만 충족하면 json.loaded할 수 있습니다. 로드하기 위해 반드시 덤프 데이터일 필요는 없습니다.
Pickle의 문제는 다른 모든 프로그래밍 언어에 특유한 직렬화 문제와 동일합니다. 즉, Python에서만 사용할 수 있으며, 서로 다른 Python 버전이 서로 호환되지 않을 수도 있다는 것입니다. 따라서 중요하지 않은 데이터만 Pickle로 저장할 수 있습니다. 데이터를 성공적으로 역직렬화할 수 없어도 상관없습니다.
##----------------------------序列化 import pickle dic={'name':'alvin','age':23,'sex':'male'} print(type(dic))#<class 'dict'> j=pickle.dumps(dic) print(type(j))#<class 'bytes'> f=open('序列化对象_pickle','wb')#注意是w是写入str,wb是写入bytes,j是'bytes' f.write(j) #-------------------等价于pickle.dump(dic,f) f.close()
#-------------------------反序列化 import pickle f=open('序列化对象_pickle','rb') data=pickle.loads(f.read())# 等价于data=pickle.load(f) print(data['age'])
pickle과 json의 사용법은 동일합니다. 둘 다 학명은 직렬화라고 하는데, json 직렬화 결과는 문자열이고, 피클 직렬화 결과는 바이트입니다. 즉, 형태는 다르지만 내용은 동일하다. 그러나 피클에 의해 직렬화되는 것은 바이트, 즉 파일에 쓸 데이터가 바이트이므로, 파일을 열 때 반드시 해야 한다. wb 바이너리 형식으로 열립니다. pickle이 파일에 쓴 내용은 읽을 수 없지만(문자가 지저분하지만 컴퓨터는 이를 인식할 수 있음) json으로 쓴 데이터는 읽을 수 있습니다. 피클은 더 많은 데이터 유형을 지원하며 피클은 함수와 클래스를 직렬화할 수 있습니다. json은 이러한 두 가지 직렬화를 지원하지 않지만 대부분의 시나리오에서는 여전히 json이 사용됩니다.
위 내용은 Python의 json 모듈과 피클 모듈을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!