【Pandas】批量处理去除 CSV 的千分位符

问题

CSV 文件中的金额格式加了千分位符号(如 1,000.00),表字段类型为数字格式,DataX 无法正常导入数据库。

其中 CSV 文件为流水数据,所以需要保证导入的时序性,文件格式如下:

csv-old/
|-- abc2021-11-18.csv
|-- abc2021-11-19.csv
|-- abc2021-11-30.csv
# ...
|-- abc2022-02-17.csv

其中 CSV 第 8、9、10 列为金额,需要移除千分位符。

解决

import os
import re
import pandas
import cchardet

"""  """
def r(src, dst, f):
    if os.path.isdir(src):
        if not os.path.exists(dst):
            os.makedirs(dst)
        for basename in os.listdir(src):
            sub_src = os.path.join(src, basename)
            sub_dst = os.path.join(dst, basename)
            r(sub_src, sub_dst, f)
    elif os.path.isfile(src):
        f(src, dst)

"""  """
def f(src, dst):
    period_name = re.compile(r'\d{4}-\d{2}').findall(src)[-1] # 提取流水月份作为合并后的文件名
    dst = os.path.join(os.path.dirname(dst), period_name + '.csv')
    print(src + ' => ' + dst)
    encoding = None
    with open(src, 'rb') as f: 
        encoding = cchardet.detect(f.read())['encoding']
    df = pandas.read_csv(src, encoding=encoding, low_memory=True, dtype=object) # `dtype=object` 禁用自动类型推断全部以字符串形式读取
    df[df.columns[7]] = df[df.columns[7]].map(lambda amount: amount.replace(',',''))
    df[df.columns[8]] = df[df.columns[8]].map(lambda amount: amount.replace(',',''))
    df[df.columns[9]] = df[df.columns[9]].map(lambda amount: amount.replace(',',''))
    df.to_csv(dst, index=False, mode='a', encoding=encoding) # `mode='a'` 以追加方式合并
    
r('./csv-old', './csv-new', f)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值