2016-05-19 11 views
0

からそれに次のメソッドを複数の行を書き開きます。は、CSVは、一度ファイルやループのpython

generateCSVfile(name, fileDescription, filePath+"/"+name, md5Hash) 

私は、ファイルを生成する方法を見つけるオープンのままに、上記のメソッドを呼び出すと、すべてのテキスト自体をオーバーライドファイルなしでそこに書かれているしようとしています。

答えて

0

ファイルは、プログラムの実行ごとに一度空にする必要がありますが、実行中に複数回の追加、あなたは常にだけでグローバル(またはクラスメンバーの状態)を使用することができる場合にそれが一度だけ開いていることを確認してください。

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 

関与する複数のCSVファイルがあるかもしれない場合は、書き込みを行うには、インスタンスの状態とメソッドを持つクラスを使用する場合がありますので、各ファイルは独立して何回も一度クリアして追加することができます。この場合、開いているファイルハンドルの数の制限のため、各使用時にappendのための再オープンは遅くなりますが、一度開いて開いておくよりも安全です。クラスがあまりにも任意のファイル名のシングルトンがあるので、あなたはキャッシュを使用することができます。

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 

クラスの使用法は、次のいずれかとなります。簡単にインスタンスを取得

CSVGenerator(somecsvfilename).generateCSVfile(...args...) 

(必要であれば、それを作成します)一度書き込むか、インスタンスを作成して保存して再利用することができます(キャッシュルックアップのオーバーヘッドは機能しますが、機能的には同じです)。

1

使用:open('deploymentTemplate.csv', 'a')値を追加します。

構文:open(<file_name> [,<mode>])

異なるモードがあります:ファイルのみのみ記述するための

  • 'w'を読まれるとき

    • モードは'r'ことができます(同じ名前を持つ既存のファイルが消去されます)
    • 'a'は、追加するファイルを開き、ファイルに書き込まれたデータはすべて自動的に末尾に追加されます( )。
    • 'r+'は、読み取りと書き込みの両方のためにファイルを開きます。

      mode引数はオプションです。 'r'が省略されていると仮定します。

    例:

    with open("test.txt", "a") as myfile: 
        myfile.write("appended text") 
    
  • +0

    はい、私は考えましたが、このファイルは週に数回実行される可能性があります。プロジェクトが最初に実行されたときにファイルをクリアしてから追加できるとします。 – Drew1208

    +0

    ファイルを開いて空の書込みを行い、 ''a' 'モードで開きます。または、この 'file.seek(0); file.truncate()'(ファイルの内容を消去する)を行うことができます。 –

    関連する問題