2015-10-23 2 views
0

Я пытаюсь записать в файл из коллекции. В коллекции есть специальные символы, такие как ¡, которые создают проблему. Например, содержание в коллекции есть такие детали, как:Удаление специальных символов (¡) из строки

{..., Name: ¡Hi!, ...}

Сейчас я пытаюсь написать то же самое в файле, но я получаю ошибку

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128) 

Я попытался с помощью решений, предоставляемых here но тщетно. Это будет здорово, если бы кто-то может помочь мне с этим :)

Так пример выглядит следующим образом:

У меня есть коллекция, которая имеет следующие детали

{ "_id":ObjectId("5428ead854fed46f5ec4a0c9"), 
    "author":null, 
    "class":"culture", 
    "created":1411967707.356593, 
    "description":null, 
    "id":"eba9b4e2-900f-4707-b57d-aa659cbd0ac9", 
    "name":"¡Hola!", 
    "reviews":[ 

    ], 
    "screenshot_urls":[ 

    ] 
} 

Теперь я пытаюсь получить доступ к name запись здесь из коллекции, и я сделать это итерация его по коллекции т.е.

f = open("sample.txt","w"); 

for val in exampleCollection: 
    f.write("%s"%str(exampleCollection[val]).encode("utf-8")) 

f.close(); 
+0

Пробовали ли вы принятый ответ в ссылка предоставлена? – blackmamba

+0

Можете ли вы показать нам более подробную информацию о том, как вы на самом деле кодируете коллекцию, и она не работает? – bourbaki4481472

+0

Спасибо за ваши отзывы, я отредактировал вопрос и предоставил и пример. - @blackmamba – srajappa

ответ

2

Самый простой способ удалить символы, которые вы не хотите, чтобы указать символы, которые вы делаете.

>>> import string 
>>> validchars = string.ascii_letters + string.digits + ' ' 
>>> s = '¡Hi there!' 
>>> clean = ''.join(c for c in s if c in validchars) 
>>> clean 
'Hi there' 

Если некоторые формы пунктуации в порядке, добавьте их в действующие символы.

0

Как один пользователь разместил на this, вы должны взглянуть на учебник Unicode в документах: https://docs.python.org/2/howto/unicode.html

Что происходит, вы пытаетесь использовать символ, который находится вне диапазона ASCII, который составляет всего 128 символов. Там очень хорошая статья об этом, я нашел некоторое время назад, и я попытаюсь найти и опубликовать здесь.

Edit: ах, вот оно: http://www.joelonsoftware.com/articles/Unicode.html

1

Это приведет к удалению всех символов в строке, которая недействительна ASCII.

>>> '¡Hola!'.encode('ascii', 'ignore').decode('ascii') 
'Hola!' 

В качестве альтернативы, вы можете write the file as UTF-8, которые могут представлять собой почти все символы на Земле.

0

Вы пытаетесь конвертировать юникод в ASCII в «строгий» режим:

>>> help(str.encode) 
Help on method_descriptor: 

encode(...) 
    S.encode([encoding[,errors]]) -> object 

    Encodes S using the codec registered for encoding. encoding defaults 
    to the default encoding. errors may be given to set a different error 
    handling scheme. Default is 'strict' meaning that encoding errors raise 
    a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and 
    'xmlcharrefreplace' as well as any other name registered with 
    codecs.register_error that is able to handle UnicodeEncodeErrors. 

Вы, вероятно, хотите что-то вроде одного из следующих действий:

s = u'¡Hi there!' 

print s.encode('ascii', 'ignore') # removes the ¡ 
print s.encode('ascii', 'replace') # replaces with ? 
print s.encode('ascii','xmlcharrefreplace') # turn into xml entities 
print s.encode('ascii', 'strict') # throw UnicodeEncodeErrors