使用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编码
解决方法
- 使用encodind
file = pd.read_csv(filename) # 读取csv文件
在此加入 encoding=‘gbk’ 使其读取方式变为gbk,即
file = pd.read_csv(filename, encoding='gbk') # 读取csv文件
- 手动更改文件编码
将文件从 .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()