[英]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.