簡體   English   中英

從CSV文件中刪除一行

[英]Delete a row from csv file

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)

James Smith,2025550131
Kevin Harris,2025550105

這就是我的csvfile的樣子。

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

運行代碼后,這是names.csv文件。

在您的第一個寫循環中未聲明row ,因此在IDE中運行該命令可能會記住一次嘗試未成功的輸出,並且您遇到了一個奇怪的問題。

您也每次都寫標題。 只是不要,默認情況下已完成。

另外:您正在與進行比較,而不是與值進行比較。 if name not in row:檢查名稱是否為鍵(不能發生),鍵為"first_name","number"

if name != row['first_name']:需要執行以下操作if name != row['first_name']:

最后但並非最不重要的一點是,無需再次讀取/寫入文件來替換輸入,只需執行shutil.move以覆蓋輸出即可。

我的修復建議(請注意newline='' ,在使用python 3以避免某些最新版本的空白行時更好):

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')

您需要閱讀輸入的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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM