<p>如果每次程序运行都需要清空一次文件,但在一次运行中需要多次追加,则可以始终使用全局(或类成员状态)来确保只打开一次。你知道吗</p>
<pre><code>import atexit
csvfile = None
def generateCSVfile(fileName,fileDescription,fileLocation,md5Hash):
global csvfile
if csvfile is None:
# Lazily open file on first call
csvfile = open('deploymentTemplate.csv', 'w')
atexit.atexit(csvfile.close) # Close cleanly on program exit
try:
csvwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL, newline='')
# do whatever writing you need to csvwriter
finally:
csvfile.flush() # Match behavior of repeated with/open, force predictable flush
</code></pre>
<p>如果可能涉及多个CSV文件,您可以使用一个具有实例状态的类和一个方法来进行写入,这样每个文件可以单独清除一次并附加多次。在这种情况下,由于对打开的文件句柄数量的限制,每次使用append时重新打开要比打开一次并保持打开更慢但更安全。您可以使用缓存,以便该类也是任何给定文件名的单例:</p>
<pre><code>import weakref
class CSVGenerator:
CACHE = {}
CACHELOCK = threading.Lock()
def __new__(cls, csvfilename):
canonicalname = os.path.realpath(csvfilename)
newself = super().__new__(cls)
with cls.CACHELOCK:
self = cls.CACHE.setdefault(canonicalname, newself)
if newself is self:
# First time we opened this file, clear file and initialize instance
with open(canonicalname, 'w') as f:
pass
self.csvfilename = canonicalname
self.appendlock = threading.Lock()
return self
def generateCSVfile(self, fileName, fileDescription, fileLocation, md5Hash):
with newself.appendlock, open(self.csvfilename, 'a', newline='') as csvfile:
createRow = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL)
# Perform writes to file
</code></pre>
<p>类的用法可以是:</p>
<pre><code> CSVGenerator(somecsvfilename).generateCSVfile(...args...)
</code></pre>
<p>它简单地获取一个实例(如果需要的话创建一个实例),然后写一次,或者它可以创建和存储一个实例并重用它(节省了缓存查找的开销,但在功能上是相同的)。你知道吗</p>