乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python寫(xiě)的csv文件,如何讓 Excel 雙擊打開(kāi)不亂碼?

       liqualife 2020-03-10

      來(lái)源:未聞Code

      我們常常需要在 Python 中輸出 CSV 文件,但你可能會(huì)發(fā)現(xiàn),這些輸出的 CSV文件,不能雙擊使用 Excel 打開(kāi),否則中文會(huì)變成亂碼。例如下面這段代碼:

      1. import pandas as pd

      2. datas = [

      3. {

      4. 'name': '王小一',

      5. 'age': 29,

      6. 'address': '北京'

      7. },

      8. {

      9. 'name': '張小二',

      10. 'age': 18,

      11. 'address': '四川'

      12. },

      13. {

      14. 'name': '李小三',

      15. 'age': 60,

      16. 'address': '上海'

      17. }

      18. ]

      19. df = pd.DataFrame(datas)

      20. df.to_csv('person.csv', index=False)

      如果雙擊使用 Excel 打開(kāi),你會(huì)發(fā)現(xiàn)中文變成了亂碼,如下圖所示:

      這是因?yàn)?,?dāng)你執(zhí)行代碼 df.to_csv('person.csv',index=False)時(shí),它默認(rèn)會(huì)以 UTF-8編碼方式寫(xiě) CSV 文件。但是當(dāng)你雙擊 CSV 使用 Excel打開(kāi)時(shí),Excel 會(huì)以 GBK 編碼來(lái)讀這個(gè)文件,這就導(dǎo)致了亂碼的發(fā)生。

      所以,如果是簡(jiǎn)單的中文,你可以把編碼方式人工指定為 GBK:

      1. import pandas as pd

      2. datas = [

      3. {

      4. 'name': '王小一',

      5. 'age': 29,

      6. 'address': '北京'

      7. },

      8. {

      9. 'name': '張小二',

      10. 'age': 18,

      11. 'address': '四川'

      12. },

      13. {

      14. 'name': '李小三',

      15. 'age': 60,

      16. 'address': '上海'

      17. }

      18. ]

      19. df = pd.DataFrame(datas)

      20. df.to_csv('person.csv', index=False, encoding='gbk')

      此時(shí)再雙擊使用 Excel 打開(kāi),中文就能正常顯示了,如下圖所示:

      但 GBK 編碼的字符集不夠完善,所以如果文本中包含超出 GBK 字符集的內(nèi)容,就會(huì)導(dǎo)致編碼錯(cuò)誤,如下圖所示:

      這個(gè)時(shí)候怎么辦呢?

      實(shí)際上當(dāng)你雙擊打開(kāi) CSV 的時(shí)候,Excel會(huì)檢查文件的第一個(gè)字符,如果這個(gè)字符是 BOM,那么他就知道應(yīng)該使用 UTF-8編碼方式來(lái)打開(kāi)這個(gè)文件。所謂的 BOM指的是 byte-order mark。

      BOM對(duì)應(yīng)的 Unicode 碼為 \ufeff,所以當(dāng)我們使用 UTF-8編碼方式生成 CSV 以后,再增加一步,把 BOM 寫(xiě)入到文件的第一個(gè)字符:

      1. with open('person.csv', encoding='utf-8') as f:

      2. content = f.read()

      3. content_with_bom = '\ufeff' + content

      4. with open('person.csv', 'w', encoding='utf-8') as f:

      5. f.write(content_with_bom)

      完整代碼如下圖所示:

      此時(shí),新的 CSV 文件可以直接雙擊通過(guò) Excel 打開(kāi),并且中文支持完全正常,如下圖所示:

      這樣生成的 Excel 雖然在 Excel 上顯示沒(méi)有問(wèn)題,但是如果你發(fā)給別人,別人使用 Python 自帶的 csv 模塊打開(kāi),就會(huì)發(fā)現(xiàn) address這一列的列名不是 address而是 \ufeffaddress,如下圖所示:

      這個(gè) BOM字符雖然肉眼看不到,但是程序能夠看到,這就會(huì)導(dǎo)致別人在讀這個(gè) CSV 文件的時(shí)候非常不方便。如果直接使用 address去讀,還會(huì)報(bào)錯(cuò):

      難道此時(shí),需要先用普通方式讀取 csv 文件,移除第一個(gè) BOM 字符,然后再傳給 CSV 模塊嗎?這未免太過(guò)麻煩。

      好在 Python 只帶了處理 BOM的編碼方式 utf-8-sig,無(wú)論是寫(xiě)文件還是讀文件,只要使用這個(gè)編碼方式,Python 在寫(xiě)文件的時(shí)候會(huì)自動(dòng)加上 BOM,在讀文件的時(shí)候會(huì)自動(dòng)刪除 BOM。

      所以生成 CSV 文件的代碼如下:

      1. import pandas as pd

      2. datas = [

      3. {

      4. 'name': '王小一',

      5. 'age': 29,

      6. 'address': '北京'

      7. },

      8. {

      9. 'name': '張小二',

      10. 'age': 18,

      11. 'address': '四?川'

      12. },

      13. {

      14. 'name': '李小三',

      15. 'age': 60,

      16. 'address': '上海'

      17. }

      18. ]

      19. df = pd.DataFrame(datas)

      20. df.to_csv('person.csv', index=False, encoding='utf-8-sig')

      此時(shí)生成的 CSV 文件,可以直接雙擊使用 Excel 打開(kāi),中文正常顯示。

      如果要使用 Python 的 CSV 模塊讀取文件,也非常簡(jiǎn)單,如下圖所示:

      讀取出來(lái)的內(nèi)容直接使用,BOM 已經(jīng)被 Python 自動(dòng)移除了。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多