V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanqieipnet
V2EX  ›  推广

怎么利用 Python 解决 csv 文件读写乱码问题?

  •  
  •   fanqieipnet · 2020-12-18 17:33:52 +08:00 · 592 次点击
    这是一个创建于 1439 天前的主题,其中的信息可能已经有所发展或是发生改变。
    怎么利用 python 解决 csv 文件读写乱码问题?今天番茄加速就来说一下。

      首先,导入 3 个模块:

      # coding: utf-8

      # @author: zhenguo

      # @date: 2020-12-16

      # @describe: functions about automatic file processing

       import pandas as pd

       import os

       import chardet

       chardet 模块用于得到文件的编码格式,pandas 按照这个格式读取,然后保存为 xlsx 格式。

      获取 filename 文件的编码格式:

       def get_encoding(filename):

      """

      返回文件编码格式

      """

       with open(filename,'rb') as f:

       return chardet.detect(f.read())['encoding']

      保存为 utf-8 编码 xlsx 格式文件,支持 csv, xls, xlsx 格式的文件乱码处理。需要注意,如果读入文件为 csv 格式,保存时要使用 xlsx 格式:

       def to_utf8(filename):

      """

      保存为 to_utf-8

      """

       encoding = get_encoding(filename)

       ext = os.path.splitext(filename)

       if ext[1] =='.csv':

       if 'gb' in encoding or 'GB' in encoding:

       df = pd.read_csv(filename,engine='python',encoding='GBK')

       else:

       df = pd.read_csv(filename,engine='python',encoding='utf-8')

       df.to_excel(ext[0]+'.xlsx')

       elif ext[1]=='.xls' or ext[1] == '.xlsx':

       if 'gb' in encoding or 'GB' in encoding:

       df = pd.read_excel(filename,encoding='GBK')

       else:

       df = pd.read_excel(filename,encoding='utf-8')

       df.to_excel(filename)

       else:

       print('only support csv, xls, xlsx format')

      上面函数实现单个文件转化,下面 batch_to_utf8 实现目录 path 下所有后缀为 ext_name 文件的批量乱码转化:

       def batch_to_utf8(path,ext_name='csv'):

      """

       path 下,后缀为 ext_name 的乱码文件,批量转化为可读文件

      """

       for file in os.listdir(path):

       if os.path.splitext(file)[1]=='.'+ext_name:

       to_utf8(os.path.join(path,file))

      调用:

       if __name__ == '__main__':

       batch_to_utf8('.') # 对当前目录下的所有 csv 文件保存为 xlsx 格式,utf-8 编码的文件

      文件读写时乱码问题,经常会遇到,相信今天这篇文章里的 to_utf8,batch_to_utf8 函数会解决这个问题,你如果后面遇到,不妨直接引用这两个函数尝试下。
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3551 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.