2017-01-04 37 views
-1
name = input("Enter a name : ") 
fieldnames = ["first_name", "number"] 
with open('names.csv') as csvfile, open('output.csv', 'w') as outputfile: 
    reader = csv.DictReader(csvfile, fieldnames=fieldnames) 
    writer = csv.DictWriter(outputfile, fieldnames=fieldnames) 
    for line in reader: 
     if name not in line: 
      fieldnames = ["name", "number"] 
      writer.writeheader() 
      writer.writerow({'first_name': row['first_name'], 
          'number': row['number']}) 
with open('names.csv', 'w') as csvfile, open('output.csv') as outputfile: 
    reader = csv.DictReader(outputfile, fieldnames=fieldnames) 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
    for row in reader: 
     fieldnames = ['first_name', 'number'] 
     writer.writeheader() 
     writer.writerow({'first_name': row['first_name'], 
         'last_name': row['number']}) 

これまでに記述したとおりです。私は、出力ファイルにそれで名前の変数が含まれていない行を書き、裏たcsvfile(names.csv)csvファイルから行を削除する

James Smith,2025550131 
Kevin Harris,2025550105 

これは私たcsvfileがどのように見えるかであるためにそれを書きたいと思います。

first_name,last_name 
James Smith,2025550131 
first_name,last_name 
James Smith,2025550131 

これはコードを実行した後のnames.csvファイルです。

+1

ご希望の出力は何ですか? – Moberg

+0

'row'は最初の書き込みループで宣言されていません。 2番目のループは、元のファイルを置き換えるための 'shutil.move()'で置き換えることができます。 –

+0

名前のない行を含む出力ファイルが必要です。 –

答えて

0

あなたが入力name.csvファイルを読み込む必要があります。

チェックイン名が入力名と一致する場合は、その行を無視します。

一致しない場合は、出力ファイルに内容を書き込みます。

最後に、出力ファイルを元のname.csvファイルにコピーします。

import csv, shutil 
name = 'vikash' # This you can take as input from user 
fieldnames = ["first_name", "number"] 
with open('names.csv', 'r') as csvfile, open('output.csv', 'w') as outputfile: 
    reader = csv.DictReader(csvfile, fieldnames=fieldnames) 
    writer = csv.DictWriter(outputfile, fieldnames=fieldnames) 
    for row in reader: 
     if not name == row['first_name']: 
      writer.writerow({'first_name': row['first_name'], 'number': row['number']}) 
shutil.move('output.csv','names.csv') 

names.csv

first_name,number 
vikash,1 
viki,2 
pawan,3 

output.csv

first_name,number 
viki,2 
pawan,3 

あなたのコードが機能しなかった理由:

name = input("Enter a name : ") 
fieldnames = ["first_name", "number"] 
with open('names.csv') as csvfile, open('output.csv', 'w') as outputfile: 
    reader = csv.DictReader(csvfile, fieldnames=fieldnames) 
    writer = csv.DictWriter(outputfile, fieldnames=fieldnames) 
    for line in reader: 
     # you are reading line from reader but you are using row later. 
     if name not in line: 
      fieldnames = ["name", "number"] 
      # above line is not needed as its already initialised earlier. 
      writer.writeheader() 
      # this is not required as header will be written automatically. 
      # Plus you also don't want to write header ever time you write a row to the output file. 
      writer.writerow({'first_name': row['first_name'], 'number': row['number']}) 
      # use line variable here or change line above to row. 
+0

これは完璧に働いてくれてありがとう! –

+0

@TmXGordioNREKT恐ろしい、私は助けることができてうれしい。 –

2

rowが最初の書き込みループで宣言されていないため、IDEでこれを実行すると、半成功の試みの出力が記憶されていて奇妙な問題が発生する可能性があります。

また、毎回ヘッダーを書きます。ただ、デフォルトでは完了していません。

また、のキーと比較しています。 if name not in row:は、その名前がキーであるかどうかをチェックします。キーは"first_name","number"です。

あなたがif name != row['first_name']:

はなく、少なくとも最後に、入力を置き換えるために再度ファイルの書き込み/読み込みする必要がちょうど出力で上書きするshutil.moveを実行しない行う必要があります。

私の修正案(最新バージョンのため、一部ではないに空白行を避けるためのpython 3を使用した場合、より良い、newline=''に注意してください):

import shutil,csv 

name = input("Enter a name : ") 
fieldnames = ["first_name", "number"] 
with open('names.csv') as csvfile, open('output.csv', 'w',newline='') as outputfile: 
    reader = csv.DictReader(csvfile, fieldnames=fieldnames) 
    writer = csv.DictWriter(outputfile, fieldnames=fieldnames) 
    for row in reader: # row, not line !! 
     if name != row['first_name']: 
      writer.writerow({'first_name': row['first_name'], 'number': row['number']}) 

# replace original file 
shutil.move('output.csv','names.csv') 
関連する問題