Python對csv檔案讀寫操作
阿新 • • 發佈:2018-11-16
包括使用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取消支付! >>>>>>>>>>>>>>>>>>>>>>>>> 批量代付完成!