2016-12-07 2 views
0

나는 최근에 pdf에서 모든 책갈피를 추출하고 docx 파일에 저장하는 스크립트를 작성했습니다. 파일의 90 %에서 작동하지만 유감스럽게도 유니 코드에 문제가있는 것 같습니다.파이썬 잘못된 ASCII 문자 제거

나는이 같은 목록에서 책갈피를 얻을 :

ValueError('All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters',) 

코드 :

from docx import Document 

list1 = [[u'3. Mechatronik f\xfcr Doppelkupplungsgetriebe, Sicherungshalter B, Sicherung 14 auf Sicherungshalter C', 2], 
    [u'4. Geber f\xfcr Getriebeeingangsdrehzahl, Hydraulikdruckgeber 1 f\xfcr automatisches Getriebe, Magnetventil 2, Magnetventil \x04, Magnetventil 5', 2], 
    [u'5. W\xe4hlhebel, Schalter f\xfcr W\xe4hlhebel in P gesperrt, Magnet f\xfcr W\xe4hlhebelsperre', 2], 
    [u'6. W\xe4hlhebel, Geber 2 f\xfcr Antriebswellendrehzahl, W\xe4hlhebel-Positionsanzeige', 2]] 

def save_docx(list1): 
document = Document('default.docx') 
file = open("Error_Log.txt", 'w') 
for i in list1: 
    try: 
     p = document.add_paragraph() 
     p.add_run(i[0]).bold = True 
    except Exception as e: 
     file.write(repr(e) + '\n') 
file.close() 
document.save('Bookmarks.docx') 

save_docx(list1) 

임 전 기능을 실행하려고하면

[[u'3. Mechatronik f\xfcr Doppelkupplungsgetriebe, Sicherungshalter B, Sicherung 14 auf Sicherungshalter C', 2], 
[u'4. Geber f\xfcr Getriebeeingangsdrehzahl, Hydraulikdruckgeber 1 f\xfcr automatisches Getriebe, Magnetventil 2, Magnetventil \x04, Magnetventil 5', 2], 
[u'5. W\xe4hlhebel, Schalter f\xfcr W\xe4hlhebel in P gesperrt, Magnet f\xfcr W\xe4hlhebelsperre', 2], 
[u'6. W\xe4hlhebel, Geber 2 f\xfcr Antriebswellendrehzahl, W\xe4hlhebel-Positionsanzeige', 2]] 

내가 오류 문제를 추측하면 \x0하지만 전체 d를 망치지 않고 이런 부분을 제거하는 방법을 알 수는 없습니다. 메모. 나는 diffenrent 인코딩과 온라인에서 찾을 수있는 다른 방법을 시도했지만 지금까지 아무 것도 작동하지 않았습니다.

도움이 될 것입니다.

+0

시도해 보셨습니까? 'i [0] .encode ('utf-8')'http://stackoverflow.com/questions/5760936/handle-wrongly-encoded-character-in-python-unicode-string의 토론을 기초로합니다 –

+0

예 i 예를 들어 다양한 방식으로 디 - 앤 - 인코딩을 시도했다. 'i [0] .encode ('ascii' 'ignore')'등 아무것도 작동하지 않았습니다. 또한 지금까지는 도움이 될만한 도서관을 보았습니다. – TacashiX

+0

@jackmorris의 멋진 답변입니다. 인코딩 된 후에 제어 문자가 문자열에 남아있을 수 있습니까? 따라서 최종 결과는 동일합니다. (오류 '제어 문자 없음') –

답변

0

올바른 가정 : \x04은 제어 문자이며 오류 메시지에 컨트롤이 허용되지 않는다고 명시 적으로 표시되어 있습니다.

제어 문자를 문서에 추가하기 전에 문자열에서 필터링하여 문제를 해결할 수 있습니다. 이것은 파이썬의 unicodedata module, 특히 unicodedata.category으로 할 수 있습니다. 제외하려는 카테고리는 모든 제어 문자를 포함하는 'C'(http://www.unicode.org/reports/tr44/#GC_Values_Table에서)로 시작합니다.

다음 현재 add_run 라인 대신에 작동합니다 : 여담으로

line = filter(lambda c: unicodedata.category(c)[0] != 'C', i[0]) 
p.add_run(line).bold = True 

, 유니 코드 문자열에서 유니 코드 문자를 포함하는 일반적인 방법이 아니라 \ XXX보다는 \ Uxxxx에, (함께 XXXX는 유니 코드 코드 포인트의 16 진수입니다.

+0

'\ x04 '에 유니 코드가 반환하는 범주는'C '가 아니라'Cc '입니다. 그리고 저는 '\ uXXXX' 표기법이 "전형적인"방법이라고 말하지 않을 것입니다, 256 이하의 코드 포인트에 대해서는'\ xXX','\ u00XX'와'\ U000000XX' 사이에는 차이가 없으며, 파이썬 자체는 항상 'ascii ("\ U000000FF")'(또는 python2에서'repr (u "\ U000000FF")'와 같이 가능한 가장 짧은 형식을 사용한다)는'\ xff'를 준다. – mata

+0

범주 'C'에는 'Cc'와 형식 제어 문자 인 'Cf'가 포함됩니다. –

+0

다른 말로, 'typical'은 아마도 잘못된 단어 일 것입니다. 그러나 특히 256을 초과 할 때 유니 코드 문자를 바이트 값이 아닌 코드 포인트로 지정하는 것이 더 합리적이라고 생각합니다. 값이 낮은 코드 포인트에는 차이가 없습니다. –