使用 python pandas 对 csv文件进行读写 写入指定列 报错UnicodeDecodeError解决方法 python脚本自动更改文件编码

使用pandas对csv文件进行读写 添加指定列

1. 引入pandas
import pandas as pd
2. 读取csv文件
filename = r"../.././import/feature.csv"  # 文件地址
file = pd.read_csv(filename)  # 读取csv文件
3. 赋值要写入的数组
fault_list = [
    'DE_BO_7', 'DE_BO_14', 'DE_BO_21', 'DE_IR_7', 'DE_IR_14', 'DE_IR_21', 'DE_OR_7', 'DE_OR_14', 'DE_OR_21', 'FE_IR_7',
    'FE_IR_14', 'FE_IR_21', 'FE_OR_7', 'FE_OR_14', 'FE_OR_21'
]
4. 添加列

比如要将此数组写入DE_min这一列(DE_min这一列可以已存在,也可以未存在自动创建

file['DE_min'] = pd.DataFrame(fault_list)

如果需要循环赋值,可以分开写以赋值data

data = pd.DataFrame(fault_list)
file['DE_min'] = data

此处file文件需要有长度,不然会报错Cannot set a frame with no defined index and a value that cannot be converted to a Series

5.写入csv
# mode=a,以追加模式写入,header表示列名,默认为true,index表示行名,默认为true,再次写入不需要行名
file.to_csv(filename, index=False)  # 写入csv文件
完整代码
import pandas as pd

filename = r"../.././import/feature.csv"  # 文件地址
file = pd.read_csv(filename)  # 读取csv文件
fault_list = [
    'DE_BO_7', 'DE_BO_14', 'DE_BO_21', 'DE_IR_7', 'DE_IR_14', 'DE_IR_21', 'DE_OR_7', 'DE_OR_14', 'DE_OR_21', 'FE_IR_7',
    'FE_IR_14', 'FE_IR_21', 'FE_OR_7', 'FE_OR_14', 'FE_OR_21'
]
file['DE_min'] = pd.DataFrame(fault_list)
# mode=a,以追加模式写入,header表示列名,默认为true,index表示行名,默认为true,再次写入不需要行名
file.to_csv(filename, index=False)  # 写入csv文件
报错 UnicodeDecodeError

在这里插入图片描述

**UnicodeDecodeError**: 'utf-8' codec can't decode byte 0xc7 in position 0: invalid continuation byte

原因:
文件编码问题,存在中文,需要使用gbk编码

解决方法

  1. 使用encodind
    file = pd.read_csv(filename) # 读取csv文件
    在此加入 encoding=‘gbk’ 使其读取方式变为gbk,即
file = pd.read_csv(filename, encoding='gbk')  # 读取csv文件
  1. 手动更改文件编码
    将文件从 .csv 格式更改为 .txt 格式,然后另存为选择 utf-8编码,再改为 .csv 格式即可
    如果嫌此过程过于繁琐,可以使用python脚本自动更改文件夹中所有 csv 文件的编码格式
    附代码:
# 批量更改csv文件编码为utf-8
# i!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import sys
import codecs
import chardet


def convert(filename, out_enc="UTF-8"):
    try:
        content = codecs.open(filename, 'rb').read()
        source_encoding = chardet.detect(content)['encoding']
        print("file encoding:%s" % source_encoding)

        if source_encoding != None:
            content = content.decode(source_encoding).encode(out_enc)
            codecs.open(filename, 'wb').write(content)
            print(filename, "更改为utf-8")
            # content.close()
        else:
            print("can not recgonize file encoding %s" % filename)

    except IOError as err:
        print("I/O error:{0}".format(err))


def explore(dir):
    for root, dirs, files in os.walk(dir):
        for file in files:
            if os.path.splitext(file)[1] == '.csv':
                print("filename:%s" % file)
                path = os.path.join(root, file)
                convert(path)


def main():
    # explore(os.getcwd())
    filepath = r"../.././import"
    explore(filepath)


if __name__ == "__main__":
    main()

如果有帮助,请您点个赞或是收藏啦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值