簡體   English   中英

如何在“rb”模式下使用 csv 模塊讀取 csv 文件的標題?

[英]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 閱讀器一次只能讀取一行,而不是整個文件。

要做你想做的事,你必須:

  1. 將第一行讀取為字節
  2. 將其解碼為字符串(使用正確的編碼)
  3. 將其轉換為字符串列表
  4. csv.reader解析它,最后
  5. 尋找流的開始。

否則,您最終只會上傳沒有標題的數據:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM