1. 程式人生 > >Python對csv檔案讀寫操作

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取消支付!
>>>>>>>>>>>>>>>>>>>>>>>>>
批量代付完成!