簡體   English   中英

Python 3.4 - 在寫入文件時刪除或忽略表情符號字符

[英]Python 3.4 - Remove or ignore emoji characters when writing to file

我正在嘗試解析XML文件並將內容寫入純文本文件。 我有程序工作到目前為止,直到它擊中一個表情符號字符,然后Python拋出以下錯誤:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 177-181: character maps to <undefined>

我轉到錯誤位置,在XML文件中找到以下表情符號:

表情符號

我的問題是如何將它們編碼為unicode或在寫入文件時完全刪除/忽略它們。

當我將()打印到控制台時,它輸出完美,但在寫入文件時會拋出錯誤。

我在谷歌和這里搜索過,但我得到的唯一答案是它們已經被編碼為unicode。 你可以看到我的文字是什么? 我不確定我是否正確說出來。

我正在使用的XML文件具有以下格式:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<?xml-stylesheet type="text/xsl" href="sms.xsl"?>
<smses count="1">
  <sms protocol="0" address="+00000000000" date="1346772606199" type="1" subject="null" body="Lorem ipsum dolor sit amet, consectetur adipisicing elit," toa="null" sc_toa="null" service_center="+00000000000" read="1" status="-1" locked="0" date_sent="1346772343000" readable_date="Sep 4, 2012 10:30:06 AM" contact_name="John Doe" />
</smses>

您有兩種選擇:

  1. 選擇一個可以處理表情符號代碼點的編碼。 您已使用默認編解碼器(取決於您的系統)打開文件以進行編寫,或者選擇了不支持代碼點的顯式編碼。

    UTF編碼可以很好地處理代碼點; 我在這里選擇UTF-8:

     with open(filename, 'w', encoding='utf8') as outfile: outfile.write(yourdata) 
  2. 設置一個錯誤處理模式,它可以替換您的編解碼器無法處理的代碼點與替換字符,轉義序列或完全忽略它們。 請參閱open()函數 errors參數:

    errors是一個可選字符串,用於指定如何處理編碼和解碼錯誤 - 這不能在二進制模式下使用。 雖然已經使用codecs.register_error()注冊的任何錯誤處理名稱也有效,但可以使用各種標准錯誤處理程序。 標准名稱是:

    • 如果存在編碼錯誤,則'strict'引發ValueError異常。 默認值None具有相同的效果。
    • 'ignore'忽略錯誤。 請注意,忽略編碼錯誤可能會導致數據丟失。
    • 'replace'導致在有錯誤數據的地方插入替換標記(例如'?' )。
    • 'surrogateescape'將表示任何不正確的字節,作為Unicode專用區中的代碼點,范圍從U + DC80到U + DCFF。 當在寫入數據時使用surrogateescape錯誤處理程序時,這些私有代碼點將被轉回到相同的字節中。 這對於處理未知編碼的文件很有用。
    • 只有在寫入文件時才支持'xmlcharrefreplace' 編碼不支持的字符將替換為相應的XML字符引用&#nnn;
    • 'backslashreplace' (也只在編寫時支持)用Python的反斜杠轉義序列替換不支持的字符。

    因此,使用errors='ignore'打開文件將不會編寫表情符號代碼點而不是引發錯誤:

     with open(filename, 'w', errors='ignore') as outfile: outfile.write(yourdata) 

演示:

>>> a_ok = 'The U+1F44C OK HAND SIGN codepoint: \U0001F44C'
>>> print(a_ok)
The U+1F44C OK HAND SIGN codepoint: 👌
>>> a_ok.encode('utf8')
b'The U+1F44C OK HAND SIGN codepoint: \xf0\x9f\x91\x8c'
>>> a_ok.encode('cp1251', errors='ignore')
b'The U+1F44C OK HAND SIGN codepoint: '
>>> a_ok.encode('cp1251', errors='replace')
b'The U+1F44C OK HAND SIGN codepoint: ?'
>>> a_ok.encode('cp1251', errors='xmlcharrefreplace')
b'The U+1F44C OK HAND SIGN codepoint: &#128076;'
>>> a_ok.encode('cp1251', errors='backslashreplace')
b'The U+1F44C OK HAND SIGN codepoint: \\U0001f44c'

請注意, 'surrogateescape'選項的空間有限,實際上只能用於解碼具有未知編碼的文件; 在任何情況下它都無法處理表情符號。

(編輯:這個答案與Python 2.x有關,而不是Python 3.x)

目前,您正在使用默認編碼將unicode字符串寫入文件,該編碼不支持表情符號(或者,就此而言,您可能確實需要大量字符)。 您可以使用支持所有unicode字符的UTF-8編碼進行編寫。

而不是執行file.write( data ) ,請嘗試file.write( data.encode("utf-8") )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM