<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 問題 你想在不關閉一個已打開的文件前提下增加或改變它的Unicode編碼。 ## 解決方案 如果你想給一個以二進制模式打開的文件添加Unicode編碼/解碼方式,可以使用 `io.TextIOWrapper()` 對象包裝它。比如: import urllib.request import io u = urllib.request.urlopen('http://www.python.org') f = io.TextIOWrapper(u, encoding='utf-8') text = f.read() 如果你想修改一個已經打開的文本模式的文件的編碼方式,可以先使用 `detach()` 方法移除掉已存在的文本編碼層,并使用新的編碼方式代替。下面是一個在 `sys.stdout` 上修改編碼方式的例子: >>> import sys >>> sys.stdout.encoding 'UTF-8' >>> sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='latin-1') >>> sys.stdout.encoding 'latin-1' >>> 這樣做可能會中斷你的終端,這里僅僅是為了演示而已。 ## 討論 I/O系統由一系列的層次構建而成。你可以試著運行下面這個操作一個文本文件的例子來查看這種層次: >>> f = open('sample.txt','w') >>> f <_io.TextIOWrapper name='sample.txt' mode='w' encoding='UTF-8'> >>> f.buffer <_io.BufferedWriter name='sample.txt'> >>> f.buffer.raw <_io.FileIO name='sample.txt' mode='wb'> >>> 在這個例子中,`io.TextIOWrapper` 是一個編碼和解碼Unicode的文本處理層,`io.BufferedWriter` 是一個處理二進制數據的帶緩沖的I/O層,`io.FileIO` 是一個表示操作系統底層文件描述符的原始文件。增加或改變文本編碼會涉及增加或改變最上面的 `io.TextIOWrapper` 層。 一般來講,像上面例子這樣通過訪問屬性值來直接操作不同的層是很不安全的。例如,如果你試著使用下面這樣的技術改變編碼看看會發生什么: >>> f <_io.TextIOWrapper name='sample.txt' mode='w' encoding='UTF-8'> >>> f = io.TextIOWrapper(f.buffer, encoding='latin-1') >>> f <_io.TextIOWrapper name='sample.txt' encoding='latin-1'> >>> f.write('Hello') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file. >>> 結果出錯了,因為f的原始值已經被破壞了并關閉了底層的文件。 `detach()` 方法會斷開文件的最頂層并返回第二層,之后最頂層就沒什么用了。例如: >>> f = open('sample.txt', 'w') >>> f <_io.TextIOWrapper name='sample.txt' mode='w' encoding='UTF-8'> >>> b = f.detach() >>> b <_io.BufferedWriter name='sample.txt'> >>> f.write('hello') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: underlying buffer has been detached >>> 一旦斷開最頂層后,你就可以給返回結果添加一個新的最頂層。比如: >>> f = io.TextIOWrapper(b, encoding='latin-1') >>> f <_io.TextIOWrapper name='sample.txt' encoding='latin-1'> >>> 盡管已經向你演示了改變編碼的方法,但是你還可以利用這種技術來改變文件行處理、錯誤機制以及文件處理的其他方面。例如: >>> sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='ascii', ... errors='xmlcharrefreplace') >>> print('Jalape\u00f1o') Jalape&#241;o >>> 注意下最后輸出中的非ASCII字符 `?` 是如何被 `&#241;` 取代的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看