1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

Python如何批量将csv文件编码方式转换为UTF-8?下面就给大家解答

介绍

你好,我是本际云服务器推荐网的小编小本本。今天想和大家分享一下如何使用Python批量处理CSV文件,特别是如何将编码转换为UTF-8的形式。

Python如何批量将csv文件编码方式转换为UTF-8?下面就给大家解答

处理CSV文件

CSV文件是一种存储文本数据的格式,日常办公中经常使用。但在使用Python的pandas库操作CSV文件时,由于编码问题可能会出现报错,例如:

pandas_libsparsers.pyxinpandas._libs.parsers.TextReader.read()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._read_low_memory()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._read_rows()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._convert_column_data()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._convert_tokens()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._convert_with_dtype()
pandas_libsparsers.pyxinpandas._libs.parsers.TextReader._string_convert()
pandas_libsparsers.pyxinpandas._libs.parsers._string_box_utf8()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte

如果只是处理一两个文件,我们可以使用系统自带的记事本,将编码方式从ANSI改为UTF-8。嫌麻烦的话,我们可以在每次使用pandas读取CSV文件前,加入以下代码:

import pandas as pd
filename = '222.csv'
try:
    df = pd.read_csv(filename, encoding='utf-8')
except BaseException:
    df = pd.read_csv(filename, encoding='cp950')
df.to_csv(filename, encoding='utf-8', index=False)

如果需要处理大量类似的ASCII格式的CSV文件,上述方法便会非常繁琐。接下来,我们可以使用Python编写一个程序来检测并批量转换CSV文件的编码方式。

处理编码方式

在批量转换CSV文件编码方式的Python程序中,我们需要使用chardet库来检测CSV文件的编码方式,并使用codecs库将编码从原始编码转换为UTF-8格式。

需要注意的是,这个程序并不完善,运行速度也没有进行优化,并且仍然有部分文件未能转换成功,但是对于日常的数据分析需要已足够。此外,由于某些原因,以下两种CSV文件无法成功转换:

  • 包含图片或图表的CSV文件
  • CSV文件本身内容即为乱码

以下是Python批量转换CSV文件编码方式的完整代码:

import os
from chardet.universaldetector import UniversalDetector

def get_filelist(path):
    """
    获取路径下所有CSV文件的路径列表
    """
    Filelist = []
    for home, dirs, files in os.walk(path):
        for filename in files:
            if ".csv" in filename:
                Filelist.append(os.path.join(home, filename))
    return Filelist

def read_file(file):
    """
    逐个读取文件内容
    """
    with open(file, 'rb') as f:
        return f.read()

def get_encode_info(file):
    """
    逐个读取文件编码方式
    """
    with open(file, 'rb') as f:
        detector = UniversalDetector()
        for line in f.readlines():
            detector.feed(line)
            if detector.done:
                break
        detector.close()
        return detector.result['encoding']

def convert_encode2utf8(file, original_encode, des_encode):
    """
    将文件编码方式从原始编码转换为UTF-8格式,并写入原文件中
    """
    file_content = read_file(file)
    file_decode = file_content.decode(original_encode, 'ignore')
    file_encode = file_decode.encode(des_encode)
    with open(file, 'wb') as f:
        f.write(file_encode)

def read_and_convert(path):
    """
    读取文件并转换编码
    """
    Filelist = get_filelist(path=path)
    fileNum = 0
    for filename in Filelist:
        try:
            file_content = read_file(filename)
            encode_info = get_encode_info(filename)
            if encode_info != 'utf-8':
                fileNum += 1
                convert_encode2utf8(filename, encode_info, 'utf-8')
                print('成功转换%s个文件: %s' % (fileNum, filename))
        except BaseException:
            print(filename, '存在问题,请检查!')

def recheck_again(path):
    """
    再次检查文件编码是否为UTF-8
    """
    print('---------------------以下文件仍存在问题---------------------')
    Filelist = get_filelist(path)
    for filename in Filelist:
        encode_info_ch = get_encode_info(filename)
        if encode_info_ch != 'utf-8':
            print(filename, '的编码方式是:', encode_info_ch)
    print('--------------------------检查结束--------------------------')

if __name__ == "__main__":
    """
    输入文件路径
    """
    path = './'
    read_and_convert(path)
    recheck_again(path)
    print('转换结束!')

总结

本文介绍了如何使用Python批量处理CSV文件,以及如何将编码方式从原始编码转换为UTF-8格式。通过使用chardet和codecs库,我们可以快速、高效地完成这项任务,提高效率。

希望这篇文章能够对你有所帮助,如有疑问或建议,欢迎留言或私信联系我。谢谢!

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/7175.html