<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 刪除文件中的亂碼

          共 760字,需瀏覽 2分鐘

           ·

          2022-04-07 10:09

          當(dāng)我們用 Python 來(lái)處理有亂碼的文件時(shí),經(jīng)常會(huì)遇到編碼錯(cuò)誤,有時(shí)候不得不加一個(gè) errors = 'ignore' 參數(shù)來(lái)忽略錯(cuò)誤,今天分享一下如何用 Python 來(lái)刪除這些亂碼,得到一個(gè)干凈的文件。

          先說(shuō)下思路:用二進(jìn)制方式打開文件,這樣就不會(huì)出現(xiàn)編碼問題,然后讀取每一個(gè)字節(jié),只要這個(gè)字節(jié)不在我們使用編碼的范圍內(nèi),就把它踢掉,然后保存剩下的字節(jié),我們得到的就是一個(gè)干凈的文件。

          比如說(shuō)這樣 ascii 編碼的文件,它含有亂碼:

          處理之后是這樣的:

          代碼是這樣寫的:

          import?struct?

          def?is_good_byte(b):
          ????"""
          ????可以自定義什么是好字節(jié),比如?GBK?的字節(jié)范圍可以在這里定義好
          ????"""

          ????return?b?<=?127

          def?clean_bytes(bs):
          ????return?filter(is_good_byte,?bs)

          def?clean_file_bin():
          ????with?open("names.txt",?mode?=?"rb")?as?reader:
          ????????with?open("cleaned_names.txt",?mode?=?"wb")?as?writer:
          ????????????for?line?in?reader:
          ????????????????for?byte?in?clean_bytes(line):
          ????????????????????writer.write(struct.pack('B',byte))

          if?__name__?==?'__main__':
          ????clean_file_bin()

          上面這段代碼是一個(gè)字節(jié)一個(gè)字節(jié)來(lái)處理的,如果是多字節(jié)編碼,可以自行修改代碼邏輯,比如一次讀取 3 個(gè)字節(jié),判斷這三個(gè)字節(jié)是否一個(gè)合法的字節(jié)組合。

          對(duì)于中英文混合的,比如:

          >>>?x
          'abc中國(guó)'
          >>>?x.encode("GBK")
          b'abc\xd6\xd0\xb9\xfa'
          >>>?for?i?in?x.encode("GBK"):
          ...?????print(i)
          ...
          97
          98
          99
          214
          208
          185
          250
          >>>

          需要綜合判斷,先判斷是否英文字母,是的就放行,然后看接下來(lái)的兩個(gè)字節(jié)是否在 GBK 的編碼范圍之內(nèi),是的就放行,不是就要?jiǎng)h除,看看是刪除一個(gè)字節(jié),還是兩個(gè)字節(jié)就要繼續(xù)判斷了。刪除的依據(jù)就是不會(huì)造成更多亂碼。

          今天的分享就到這里,如果有收獲請(qǐng)點(diǎn)贊哦。

          往期推薦

          1、一個(gè)「神奇」的Python庫(kù),99%的人都愛!
          2、看完微軟大神寫的求平均值代碼,我意識(shí)到自己還是too young了
          3、美國(guó)國(guó)家安全局是如何入侵你的電腦的?
          4、美國(guó)四大科技巨頭:蘋果、微軟、Facebook、谷歌的愛恨情仇
          5、警惕!Python 中少為人知的 10 個(gè)安全陷阱!

          點(diǎn)擊關(guān)注公眾號(hào),閱讀更多精彩內(nèi)容
          瀏覽 75
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97福利 | 久久视频99 | 大香蕉乱伦网 | 日本内射黄页 | 无码黄色电影 |