2011-03-08 2 views
2

알고 싶습니다 utf-8 문자가 파이썬에서 파일의 키로 포함 된 사전을 cPickle과 함께 저장하는 방법은 무엇입니까? 이 사전은 매우 크고 cPicklepickle보다 훨씬 빠르다고 들었습니다. 또한 UTF-8로 인코딩 된 키가 문제가 있다고 생각합니다. 다른 빠른 솔루션도 환영합니다. 여기 내가 무엇을하고 아래의 오류 메시지입니다 :cPickle Python을 사용하여 utf-8 문자를 키로 사용하여 사전을 저장하는 방법은 무엇입니까?

unique_ngrams_dict = defaultdict(lambda: 0)# just to show how I defined my dict 


dict_file = codecs.open('ngram_dict', 'w', 'utf-8') 
cPickle.dump(unique_ngrams_dict,dict_file) 
dict_file.close() 

오류 메시지 :

Traceback (most recent call last): 
    File "Generate_NGram.py", line 81, in <module> 
    save_ngram_dict(unique_ngrams_dict) 
    File "Generate_NGram.py", line 70, in save_ngram_dict 
    cPickle.dump(unique_ngrams_dict,dict_file) 
    File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex 
    raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle function objects 

감사

+0

왜 생각합니까 UTF8 키는 문제가있다? 절인 해봤습니까? –

+0

실제로는 아니지만 파일에 쓸 때 인코딩해야합니까? – Hossein

+0

TypeError는'uniq_ngrams_dict'가 사전이 아닌 함수임을 나타냅니다. – Omnifarious

답변

2
  1. 피클은 형식입니다.

  2. 실제 문제는 저장하려는 개체에 함수 참조 (기본값은 lambda: 0)이며 피클 형식은 직렬화 함수를 지원하지 않습니다.

    당신은 세 가지 옵션이 있습니다 : 일반 dict

    1. 사용하고 기본 인수 .get 방법의 사용합니다. 산세 전에
    2. 설정

      unique_ngrams_dict.default_factory = None 
      

      및 unpickling 후 다시

      unique_ngrams_dict.default_factory = lambda: 0 
      

      로 설정합니다.

    3. 는 같은 클래스를 정의 :

      class NgramDefault: 
          def __call__(): 
           return 0 
      

      대신 lambda: 0의 기본 공장으로 NgramDefault()를 사용합니다.

+0

명백히 unique_ngrams_dict = defaultdict (int)가 동일하게 수행해야합니다. –

+0

파일이 해당 파일 ('ngram_dict', 'wb')처럼 열려 있어야한다고 생각합니다. –

0

당신은 그것을하고 옳은 일을 할 수있는 피클 모듈을 신뢰 단지한다 . 피클을 처리하는 가장 좋은 방법은 피클을 unpickle 할 때 시작한 정확한 데이터 구조를 마술처럼 재현 할 수있는 불투명 한 물체입니다.

피클의 출력에 어떤 종류의 인코딩을 적용하지 않으려면 이진 Blob로 처리해야합니다. 피클 때 유니 코드 요소가있는 경우 유니 코드 요소를 사용하면 unpickle이됩니다.

file('ngram_dict', 'w') 

그것은 단지 매우 비효율적이 실패한 것 이유, 아니다 : 당신은 그냥, 어떤 코덱 파일을 열해서는 안

+0

더 빠른 옵션이 있습니까? 쓰기/파일 로딩 /로드와 관련하여 말입니다. – Hossein

+0

@Hossein - 당신이 물어 본 것과 완전히 다른 질문입니다. 데이터 구조의 예제를 제공하고 "이 데이터 구조를 파일로 가져 와서 다시 꺼내는 가장 빠른 방법은 무엇입니까?"라는 질문을 던지려면 훌륭한 대답을 얻으십시오. – Omnifarious