簡體   English   中英

Header 寫為 CSV Python 中的行

[英]Header written as row in CSV Python

我有以下代碼用於創建新行並將其添加到 csv 文件。

def calcPrice(data):


   fieldnames = ["ReferenceID","clientName","Date","From","To","Rate","Price"]
   with open('rec2.csv', 'a') as csvfile:

     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
     writer.writeheader()
     writer.writerow(data)

return 但是,它作為 header 作為新行也是如此。 我怎樣才能防止這種情況? 在此處輸入圖像描述

以下是整個代碼的要點鏈接: https://gist.github.com/chriskinyua/5ff8a527b31451ddc7d7cf157c719bba

您可以檢查文件是否已存在

import os

def calcPrice(data):

   filename = 'rec2.csv'
   write_header = not os.path.exists(filename)

   fieldnames = ["ReferenceID","clientName","Date","From","To","Rate","Price"]
   with open(filename, 'a') as csvfile:

     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
     if write_header:
        writer.writeheader()
     writer.writerow(data)

假設有一個我們可以調用的 function 會告訴我們是否應該寫出 header,所以代碼如下所示:

import csv

def calcPrice(data):

   fieldnames = ["ReferenceID","clientName","Date","From","To","Rate","Price"]
   with open('rec2.csv', 'a') as csvfile:

       writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
       if should_write_header(csvfile):
           writer.writeheader()
       writer.writerow(data)

should_write_header會是什么樣子? 這里有三種可能性。 對於所有這些,我們需要導入io模塊:

import io

所有這些函數的邏輯都是一樣的:我們要計算文件的結尾是否與文件的開頭相同。 如果這是真的,那么我們要寫入 header 行。

這個 function 是最詳細的:它使用文件的tell方法找到當前的 position,使用它的seek方法移動到文件的開頭,然后再次運行tell以查看報告的位置是否相同。 如果不是,它seek在返回結果之前返回文件末尾。 我們不會簡單地將EOF的值與零進行比較,因為 Python 文檔 state tell文本文件的結果不一定對應於文件指針的實際 position。

def should_write_header1(fileobj):
    EOF = fileobj.tell()
    fileobj.seek(0, io.SEEK_SET)
    res = fileobj.tell() == EOF
    if not res:
        fileobj.seek(EOF, io.SEEK_SET)
    return res

這個版本假定雖然tell方法通常不一定對應於文件指針的position,但是對於空文件, tell總是返回零。 這可能適用於常見情況。

def should_write_header2(fileobj):
    return fileobj.tell() == 0

此版本訪問TextIOWrapper (文本文件 object 類)包裝的二進制 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 的tell方法。 對於二進制流, tell被記錄為返回實際的文件指針 position。 這消除了should_write_header2的不確定性,但不幸的是, 緩沖區不能保證存在於所有 Python 實現中,所以這不是可移植的。

def should_write_header3(fileobj):
    return fileobj.buffer.tell() == 0

因此,為了 100% 的確定性,請使用should_write_header1 對於不太確定但更短的代碼,請使用其他代碼之一。 如果性能是一個問題,那么應該關注should_write_header3 ,因為二進制流中的tell比文本流中的tell更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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