2016-09-10 7 views
3
は、私が持っている、バック.CSVに特定の値を

書き込みます。 csvファイルに変更したいデータがあります。 それは次のようになります。は、Python

item_name,item_cost,item_priority,item_required,item_completed 
item 1,11.21,2,r 
item 2,411.21,3,r 
item 3,40.0,1,r,c 

私のコードは私が必要なもののほとんどを実行しますが、私はこの結果

item_name,item_cost,item_priority,item_required,item_completed 
item 1,11.21,2,x 
item 2,411.21,3,r 
item 3,40.0,1,r,c 

私のコードを生成するために戻って私の.csvの書き方がわからないよ:

print("Enter the item number:") 
    line_count = 0 
    marked_item = int(input()) 
    with open("items.csv", 'r') as f: 
     reader = csv.DictReader(f, delimiter=',') 
     for line in reader: 
      if line["item_required"] == 'r': 
       line_count += 1 
       if marked_item == line_count: 
        new_list = line 
        print(new_list) 
        for key, value in new_list.items(): 
         if value == "r": 
          new_list['item_required'] = "x" 
          print(new_list) 
    with open("items.csv", 'a') as f: 
     writer = csv.writer(f) 
     writer.writerow(new_list.values()) 

答えて

1

ここにはいくつかの問題があります

  • あなたはDictReaderを使用していますが、これはデータの読み込みには適していますが、元のファイルと同じデータを読み書きすることはできません。辞書では列の順序が保証されないためです人々は列を交換したくないとき)。あなたはcsvファイルに追加書き込みをするとき、私はちょうど
  • を、タイトルを読んで、列のタイトルのインデックスを見つけ、コードの残りの部分で、このインデックスを使用(なしdicts =速い)
  • 。あなたは古いコンテンツを削除しなければならず、追加する必要はありません。 newline=''を使用するか、空白行(python 3)または "wb"(python 2)
  • を読むと、変更したい値だけでなく、すべての値を保存する必要があります。
  • が変更(元のファイルを置き換えているので)、すべてのデータを書き戻すことができ、あなたはすべての後に、あなたがするrを変更したい(指定されたインデックスのリストに置き換え、私は単純な置き換えられovercomplexものを行います所与の行におけるx

ここ

アカウントに全て上述の発言を取る固定コードです

EDIT:あなたが後に要求する機能を追加しました:

import csv 

line_count = 0 
marked_item = int(input()) 
with open("items.csv", 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    title = next(reader) # title 
    idx = title.index("item_required") # index of the column we target 

    lines=[] 
    for line in reader: 
     if line[idx] == 'r': 
      line_count += 1 
      if marked_item == line_count: 
       line[idx] = 'x' 
       # add 'c' after x (or replace if column exists) 
       if len(line)>idx+1: # check len 
        line[idx+1] = 'c' 
       else: 
        line.append('c') 
     lines.append(line) 

with open("items.csv", 'w',newline='') as f: 
    writer = csv.writer(f,delimiter=',') 
    writer.writerow(title) 
    writer.writerows(lines) 
+0

それはありがとう、それは完璧に動作します!私は今、1つの追加機能を追加しようとしています。変更が 'x'に行われた後、 'c'を追加する必要があります。あなたが提供したコードを追加することは可能ですか?例出力:item_1,21,1、x、c –

+0

最後の編集を確認します(ただし、テストされていません) –

+0

私はそれを試しましたが、私は次の行を得ました:line [idx_r + 1] = 'c' IndexError:範囲外 –

0

を必要に応じて行を拡張し、すでにそこxcを追加していない場合は、私は、これはトリックを行う必要がありますね。

  1. ファイルを開きます。代わりに、私たちは開始時に作成csvfilewriterを使用して、右がそれを書くそれを再度開くいる(そのために使用「+ R」)、それを更新するために読み書きすることができます

ファイル。

import csv 

fieldnames = ["item_name","item_cost","item_priority","item_required","item_completed"] 

csvfile = open("items_new.csv", 'w') 
csvfilewriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect='excel', delimiter=',') 
csvfilewriter.writeheader() 

print("Enter the item number:") 
line_count = 0 
marked_item = int(input()) 
with open("items.csv", 'r') as f: 
    reader = csv.DictReader(f, delimiter=',') 
    for line in reader: 
     if line["item_required"] == 'r': 
      line_count += 1 
      if marked_item == line_count: 
       new_list = line 
       print(new_list) 
       for key, value in new_list.items(): 
        if value == "r": 
         new_list['item_required'] = "x" 
         print(new_list) 
         csvfilewriter.writerow(new_list) 

      else: 
       csvfilewriter.writerow(line) 
+0

このコードをテストしましたか?同じファイルを2回開きます。 –

+0

はい、私はそれを更新したいので、私は意図的にそれをしました、あなたは常に新しいファイルを開くことを選択して使用することができます同様に –

+0

は、ウィンドウで動作しません。クラッシュしないで(驚くべき!)、ファイルは更新されません。新しいファイルでは、そのままでは動作しません。 –

1

pandasを使用した:

import pandas as pd 

df = pd.read_csv("items.csv") 

print("Enter the item number:") 
marked_item = int(input()) 

df.set_value(marked_item - 1, 'item_required', 'x') 

# This is the extra feature you required: 
df.set_value(marked_item - 1, 'item_completed', 'c') 

df.to_csv("items.csv", index = False) 

結果あなたはcsvファイルを更新したいが、新しいものを書きたくない場合はPY

import csv 
fieldnames = ["item_name","item_cost","item_priority","item_required","item_completed"] 

csvfile = open("items.csv", 'r+') 
csvfilewriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect='excel', delimiter=',') 
csvfilewriter.writeheader() 

print("Enter the item number:") 
line_count = 0 
marked_item = int(input()) 
with open("items.csv", 'r') as f: 
    reader = csv.DictReader(f, delimiter=',') 
    for line in reader: 
     if line["item_required"] == 'r': 
      line_count += 1 
      if marked_item == line_count: 
       new_list = line 
       print(new_list) 
       for key, value in new_list.items(): 
        if value == "r": 
         new_list['item_required'] = "x" 
         print(new_list) 
         csvfilewriter.writerow(new_list) 

は、以下のコードでありますmarked_item = 1:

item_name,item_cost,item_priority,item_required,item_completed 
item 1,11.21,2,x,c 
item 2,411.21,3,r, 
item 3,40.0,1,r,c 

RFC4180に従うと、末尾のカンマを保持する必要があることに注意してください。