Python对csv文件读写操作

 包括使用csv模块进行文件读写,使用requests模块进行文件发送。

def pay_task_by_self(self):

    global success_writer, fail_writer, cont
    dir_path = os.path.dirname(__file__)
    file_path = os.path.join(dir_path, 'test.csv')
    fail_path = os.path.join(dir_path, 'fail_pay.csv')
    success_path = os.path.join(dir_path, 'success_pay.csv')

    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        next(reader)
        # 打开文件对象
        fail_file = open(fail_path, 'w', newline='')
        fail_flag = True
        success_file = open(success_path, 'w', newline='')
        success_flag = True

        for row in reader:
            # 提取文件内的信息
            data = dict(mch_no=WHALE_BANK_MCH,)
            # data['out_merchant_pay_no'] = row[0]
            data['out_merchant_pay_no'] = str(uuid.uuid4()).replace('-', '')
            data['card_no'] = row[1]
            data['coin'] = row[2]
            data['amount'] = row[3]
            data['merchant_pay_desc'] = row[4]

            user = Assets.objects.filter(card_no=row[1]).first().user

            # 请求支付接口
            res = self._request(user=user, url=WHALE_BANK_PAY_URL, data=data, method=RequestResponseMethod.PAY)
            res['data'] = data

            counter = 1

            # 代付失败
            if res.get('result_code') != WhaleBankResultCode.OK:
                print('FAIL-错误信息:' + res['err_msg'])
                cont = 'y'

                # 支付失败继续支付,可设置失败n次之后选择是否继续支付
                while res.get('result_code') != WhaleBankResultCode.OK:
                    print('卡号:%s的第%s次代付失败...正在重新支付...' % (data['card_no'], counter))
                    # 第一次写入文件失败字段
                    if fail_flag:
                        fail_header = [k for k in res]
                        fail_writer = csv.DictWriter(fail_file, fieldnames=fail_header)
                        fail_writer.writeheader()
                        fail_flag = False
                    fail_writer.writerow(res)
                    
                    # 支付失败后重新请求
                    data.pop('sign')
                    res = self._request(user=user, url=WHALE_BANK_PAY_URL, data=data, method=RequestResponseMethod.PAY)
                    res['data'] = data
                    time.sleep(1)

                    counter += 1
                    # 达到n次失败后选择是否继续支付
                    if counter == 4:
                        cont = input('失败已达%s次,是否继续?(y/n)' % (counter-1))
                        if cont == 'y':
                            pass
                        else:
                            break
                if cont == 'n':
                    print('%s取消支付!' % data['card_no'])
                else:
                    print('%s支付成功!' % data['card_no'])

            # 代付成功
            else:
                print('SUCCESS\n支付成功!')
                # 第一次写入文件成功字段
                if success_flag:
                    success_header = [k for k in res]
                    success_writer = csv.DictWriter(success_file, fieldnames=success_header)
                    success_writer.writeheader()
                    success_flag = False
                success_writer.writerow(res)

            time.sleep(0.5)
            yield res
        # 关闭文件对象
        fail_file.close()
        success_file.close()
        print('批量代付完成!')

注意:open打开一个文件之后,使用read()方法会读取出对象中的信息,再次使用read()读取会返回空的字符串。

运行结果: 

SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
FAIL-错误信息:用户卡号错误
卡号:1000000000483907的第1次代付失败...正在重新支付...
卡号:1000000000483907的第2次代付失败...正在重新支付...
卡号:1000000000483907的第3次代付失败...正在重新支付...
失败已达3次,是否继续?(y/n)n
1000000000483907取消支付!
>>>>>>>>>>>>>>>>>>>>>>>>>
批量代付完成!

猜你喜欢

转载自blog.csdn.net/Aifore/article/details/80011211