一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Python寫的csv文件,如何讓 Excel 雙擊打開不亂碼?

 liqualife 2020-03-10

來源:未聞Code

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

  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 打開,你會發(fā)現(xiàn)中文變成了亂碼,如下圖所示:

這是因為,當你執(zhí)行代碼 df.to_csv('person.csv',index=False)時,它默認會以 UTF-8編碼方式寫 CSV 文件。但是當你雙擊 CSV 使用 Excel打開時,Excel 會以 GBK 編碼來讀這個文件,這就導致了亂碼的發(fā)生。

所以,如果是簡單的中文,你可以把編碼方式人工指定為 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')

此時再雙擊使用 Excel 打開,中文就能正常顯示了,如下圖所示:

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

這個時候怎么辦呢?

實際上當你雙擊打開 CSV 的時候,Excel會檢查文件的第一個字符,如果這個字符是 BOM,那么他就知道應該使用 UTF-8編碼方式來打開這個文件。所謂的 BOM指的是 byte-order mark。

BOM對應的 Unicode 碼為 \ufeff,所以當我們使用 UTF-8編碼方式生成 CSV 以后,再增加一步,把 BOM 寫入到文件的第一個字符:

  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)

完整代碼如下圖所示:

此時,新的 CSV 文件可以直接雙擊通過 Excel 打開,并且中文支持完全正常,如下圖所示:

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

這個 BOM字符雖然肉眼看不到,但是程序能夠看到,這就會導致別人在讀這個 CSV 文件的時候非常不方便。如果直接使用 address去讀,還會報錯:

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

好在 Python 只帶了處理 BOM的編碼方式 utf-8-sig,無論是寫文件還是讀文件,只要使用這個編碼方式,Python 在寫文件的時候會自動加上 BOM,在讀文件的時候會自動刪除 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')

此時生成的 CSV 文件,可以直接雙擊使用 Excel 打開,中文正常顯示。

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    青青操在线视频精品视频| 日本女优一色一伦一区二区三区| 亚洲精品av少妇在线观看| 五月综合婷婷在线伊人| 亚洲人午夜精品射精日韩| 91精品国产综合久久福利| 日韩中文无线码在线视频| 精品人妻一区二区四区| 视频一区二区黄色线观看| 国产在线视频好看不卡| 清纯少妇被捅到高潮免费观看| 欧美午夜性刺激在线观看| 熟妇久久人妻中文字幕| 日韩午夜福利高清在线观看| 日本av在线不卡一区| 亚洲天堂国产精品久久精品| 日本东京热视频一区二区三区| 91国自产精品中文字幕亚洲| 久久精品伊人一区二区| 日本丁香婷婷欧美激情| 亚洲一区二区精品国产av | 亚洲中文字幕熟女丝袜久久| 精品国产成人av一区二区三区| 老司机精品视频免费入口| 国内九一激情白浆发布| 国内尹人香蕉综合在线| 国产亚洲午夜高清国产拍精品| 日韩精品日韩激情日韩综合| 不卡中文字幕在线免费看| 精品少妇人妻一区二区三区| 国产精品一区二区成人在线| 国产成人精品国产亚洲欧洲| 亚洲欧美天堂精品在线| 日本不卡在线一区二区三区| 国产一级不卡视频在线观看| 日韩高清一区二区三区四区| 精品久久少妇激情视频| 国产韩国日本精品视频| 国产av熟女一区二区三区四区| 国产精品一区二区三区日韩av | 高清亚洲精品中文字幕乱码|