[英]How to read the headers of a csv file using csv module in "rb" mode?
我目前正在以"rb"
模式讀取 csv 文件並將文件上傳到 s3 存儲桶。
with open(csv_file, 'rb') as DATA:
s3_put_response = requests.put(s3_presigned_url,data=DATA,headers=headers)
所有這些都工作正常,但現在我必須在進行 put 調用之前驗證 csv 文件中的標題。
當我嘗試在下面運行時,出現錯誤。
with open(csv_file, 'rb') as DATA:
csvreader = csv.reader(file)
columns = next(csvreader)
# run-some-validations
s3_put_response = requests.put(s3_presigned_url,data=DATA,headers=headers)
這拋出
_csv.Error:迭代器應該返回字符串,而不是字節(您是否以文本模式打開文件?)
作為一種解決方法,我創建了一個新函數,它以"r"
模式打開文件並對 csv 標頭進行驗證,這可以正常工作。
def check_csv_headers():
with open(csv_file, 'r') as file:
csvreader = csv.reader(file)
columns = next(csvreader)
我不想兩次讀取同一個文件。 一次用於標頭驗證,一次用於上傳到 s3。 如果我在"r"
模式下上傳,上傳部分也不起作用。
有沒有辦法在"rb"
模式下僅讀取一次文件時實現這一點? 我必須使用csv
模塊而不是pandas
庫來完成這項工作。
做你想做的事是可能的,但效率不是很高。 簡單地打開一個文件並不是那么昂貴。 CSV 閱讀器一次只能讀取一行,而不是整個文件。
要做你想做的事,你必須:
csv.reader
解析它,最后否則,您最終只會上傳沒有標題的數據:
with open(csv_file, 'rb') as DATA:
header=file.readline()
lines=[header.decode()]
csvreader = csv.reader(lines)
columns = next(csvreader)
// run-some-validations
DATA.seek(0)
s3_put_response = requests.put(s3_presigned_url,data=DATA,headers=headers)
以文本形式打開文件不僅更簡單,它還允許您將驗證邏輯與上傳代碼分開。
為確保一次只讀取一行,您可以使用buffering=1
def check_csv_headers():
with open(csv_file, 'r', buffering=1) as file:
csvreader = csv.reader(file)
columns = next(csvreader)
// run-some-validations
with open(csv_data, 'rb') as DATA:
s3_put_response = requests.put(s3_presigned_url,data=DATA,headers=headers)
或者
def check_csv_headers():
with open(csv_file, 'r', buffering=1) as file:
csvreader = csv.reader(file)
columns = next(csvreader)
// run-some-validations
//If successful
return True
def upload_csv(filePath):
if check_csv_headers(filePath) :
with open(csv_data, 'rb') as DATA:
s3_put_response = requests.put(s3_presigned_url,data=DATA,headers=headers)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.