介绍
你好,我是本际云服务器推荐网的小编小本本。今天想和大家分享一下如何使用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
