2017-03-23 12 views
0

ランダムなデータをテキストファイルに追加しようとしていますが、これで成功しましたが、ヘッダー行に問題があります。一度ヘッダー行を追加したいのですが、スクリプトを実行するたびにファイルにデータだけを追加し、ヘッダー行があれば無視してください。私はこのようなことを試みたが失敗する。私はSO python csv, writing headers only onceのこのサンプルコードを見ようとしましたが、正しく実装できませんでした。 誰かが自分のコードを修正するのを手伝ってくれたら。私は感謝するでしょう。python csv header無視してデータをCSVファイルに追加し続ける

import random 
import csv 
import os.path 
from time import gmtime, strftime 

filename = '/home/robdata/collection1.dat' 

file_exists = os.path.isfile(filename) 

v = random.randint(0, 100) 

with open(filename, "a") as csvfile: 
    headers = ['DATE', 'value'] 
    writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
    if not file_exists: 
     writer.writeheader() # file doesn't exist yet, write a header 

    writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v}) 

ヘッダー行を追加せずにデータを挿入します。私はスクリプトの最初の実行にヘッダーを含めたい、次回はスクリプトを何回か実行するときに、ヘッダー行ではなくデータだけを追加すべきです。あらゆるアイデアや助けに感謝します。

+0

あなたが疑問にあなたのコードが間違ってやっていることの説明を編集できますか? – glibdud

+0

@glibdud私は私の質問に以下を追加します。私はファイルにデータを挿入することができますが、ヘッダーはありません。 – rob

+0

ファイルを実行する前に(ファイルが存在する前に)、AttributeErrorを取得する必要があります。あなたの 'csv.writer'オブジェクトとあなたがリンクした質問で使われたものとの違いを見てみましょう。 – glibdud

答えて

2

A氏エバンスアプローチに少しシンプルな代替が存在するかどうかをテストの代わりに、以下のテストを使用することです:。

fileEmpty =はos.stat( 'collection1.dat')st_size == 0

これにより、シークなどを行う必要がなくなります。

EDIT:完全なコード:

import random 
import csv 
import os.path 
from time import gmtime, strftime 

filename = '/home/robdata/collection1.dat' 

fileEmpty = os.stat(filename).st_size == 0 

v = random.randint(0, 100) 

with open(filename, "a") as csvfile: 
    headers = ['DATE', 'value'] 
    writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
    if fileEmpty: 
     writer.writeheader() # file doesn't exist yet, write a header 

    writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v}) 
+0

ご協力いただきありがとうございます。問題の上記のコードは、私の要件に応じて完璧に動作します。助けてくれてありがとう。 – rob

+0

あなたが最初に私の質問コードを編集してうまく動作するので、私が受け入れるように答えを貼り付けたいですか?私はあなたが最初にそれを編集するのであなたに尋ねます。 – rob

+0

あなたは大歓迎です。この答えがあなたを助けたものであれば、その礼儀はあなたがそれを「受け入れた」とマークすることです。あなたがポイントを増やすと、あなたは上告することができます。 –

1

Python CSVモジュールのドキュメントから、writeheaderはDictWriterでのみ使用できます。 をコードに使用しないでください。。 これを試すことができます。

if not file_exists: 
    writer.writerow(headers) 
else: 
    writer.writerow([strftime("%Y-%m-%d %H:%M:%S", gmtime()), v, w, z]) 
+0

私の質問を編集します。前にこのアイデアを試してみましたが、私はこのエラーを受けました。 ValueError:dictにはフィールド名に含まれていないフィールドがあります: '2017-03-23 13:59:39'、94 – rob

+0

新しいコードをコピーして実行しました。それはうまく動作します。 –

1

私たちが回答を投稿している間にあなたの質問を編集したようです。変更内容を編集内容として追加するか、変更内容を記載してください。とにかく、dictフィールドは異なるが、概念は同じである。

dictwriterの上に、各列のdictキーに値として行データを渡す必要があります。

サンプルとして5秒遅れて5回書き込みするループを追加しました。
以下を参照してください。

ワーキングコード:

import random 
import csv 
import os.path 
from time import gmtime, strftime, sleep 

filename = 'collection1.csv' 

file_exists = os.path.isfile(filename) 

v = random.randint(0, 100) 
w = random.randint(0, 100) 
z = random.randint(0, 100) 
with open(filename, "a") as csvfile: 
    for i in range(5):   
     headers = ['timestamp','val1', 'val2', 'val3'] 
     writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
     if not file_exists: 
      writer.writeheader() 
     else: 
      mytime = strftime("%Y-%m-%d %H:%M:%S", gmtime()) 
      writer.writerow({'timestamp':mytime, 'val1': v,'val2': w, 'val3':z}) 

     sleep(5) 

collection1.csv

timestamp,val1,val2,val3 
2017-03-23 14:07:20,83,60,11 
2017-03-23 14:07:25,83,60,11 
2017-03-23 14:07:30,83,60,11 
2017-03-23 14:07:47,55,44,88 
2017-03-23 14:07:52,55,44,88 
2017-03-23 14:07:57,55,44,88 
2017-03-23 14:08:02,55,44,88 
2017-03-23 14:08:07,55,44,88 
+0

私はあなたのコードを試しましたが、私は同じ結果を得ます。もう一度コードを調べます。私はすぐに更新するために戻ってきます。ご助力ありがとうございます。 – rob

+0

そのままコードをコピー/ペーストしてください。それは私の最後に働いています。これはあなたの古いコードです(変更されました)。私に教えてください。 –

+0

@私は謝罪しなかったことを謝り、自分のコードを編集すると付け加えました。次回は気をつけます。 – rob

2

のではなく、ファイルが存在する場合はテストし、あなたの代わりに求めていることにより、ゼロの長さを持っているかどうかをチェックできますファイルの場所を尋ねます。これにより、ファイルが空でもまだ存在するケースのヘッダーも書き込まれます。

import random 
import csv 
from time import gmtime, strftime 

headers = ['DATE', 'value'] 
v = random.randint(0, 100) 

with open('collection1.dat', 'ab') as f_output: 
    csv_output = csv.DictWriter(f_output, fieldnames=headers) 
    f_output.seek(0, 2) 

    if f_output.tell() == 0: 
     csv_output.writeheader() 

    csv_output.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v})   

writeheader()、ファイルが空である場合にのみヘッダを書き込むために使用されます。

また、csvライブラリを使用する場合は、ファイルを常にバイナリモードで開く必要があります。 ab

+0

ありがとうございました。 – rob

関連する問題