2

データベースを作成する必要があり、txt ファイルからの削除に苦労しています。

読み取り変数から nameToFind を削除する方法がわかりません。私は辞書を使うように勧められましたか?これは私がこれまでに持っているものです:

def displayMenu():
    print ("1 - Add item")
    print ("2 - Delete item")
    print ("3 - Find item using name")
    print ("4 - Find item using score")
    print ("5 - Update score")
    print ("9 - Quit")


def getMenuChoice():
    try:
        choice = int(input("Please enter your choice:"))
    except Exception:
        return 0
    else:
        return choice


def addItem(newName, newScore, datafile):
    myFile = open(datafile, "a")
    myFile.write(newName + ":" + newScore + "\n")
    myFile.close()

def deleteItem(nameToFind, datafile):
    deletedword = str(nameToFind)
    myFile = open("datafile.txt", "r")
    read = myFile.read()
    for line in read:
        lines = line.split(":")
        #if lines == deletedword:
            #deleted = read.remove(deletedword)
            #print(deleted)
    myFile.close()
    deleted = read.remove[nameToFind]
    print(deleted)
    myFile1 = open("datafile.txt", 'w')
    myFile1.write(deleted)
    myFile1.close()    


def findItemUsingName(nameToFind, datafile):
    scores = {}
    myFile = open("datafile.txt", 'r')
    for line in myFile:
        lineValues = line.split(":")
        scores[lineValues[0]] = lineValues[1]
    myFile.close()          




highestScores = {}

choice = 0
while choice in [1, 2, 3, 4, 5, 0]:

    displayMenu()
    choice = getMenuChoice()

    if choice == 0:
        print ("Please enter 1, 2, 3, 4, 5 or 9")


    elif choice == 1:
        newName = input("Please enter the new name:")
        try:
            newScore = int(input("Please enter score for " + newName + ":"))
        except Exception:
            print("You must enter an integer for score")
        else:
            addItem(newName, str(newScore), "datafile.txt")


    elif choice == 2:
        print("Delete item")
        nameToFind = input("What is the name to delete? ")
        deleteItem(nameToFind, "datafile.txt")
    elif choice == 3:
        print("Find item using name")
        nameToFind = input("What is the name to find? ")
        findItemUsingName(nameToFind, "datafile.txt")
    elif choice == 4:
        print("Find item using score")
    elif choice == 5:
        print("Update score")

「datafile」という .txt ファイルも必要です。

4

2 に答える 2

0

プロセス

  • データをメモリに読み込み、
  • 不要なデータを除外し、
  • メモリ内のデータをファイルに書き出します。

工業用の強力なデータベースではありませんが、アイデアは得られます。たとえば、一時ファイルに書き出して、成功した場合に名前を変更することができます。

コード

def read_database(datafile):
    with open(datafile, "r") as myFile:
        return dict(line.rstrip().split(':') for line in myFile)

def write_database(datafile, data):
    with open(datafile, "w") as myFile:
        myFile.write("".join("%s:%s\n" % (k, v) for k, v in data.iteritems()))

def deleteItem(nameToFind, datafile):
    data = read_database(datafile)
    data.pop(nameToFind, None)
    write_database(datafile, data)

if __name__ == '__main__':
    datafile = "datafile.txt"
    data = {
        "Smith": 89,
        "Jones": 58,
        "Kozicki": 100,
    }
    write_database(datafile, data)
    deleteItem("Jones", datafile)

プリミティブ

これらのプリミティブを使用すると、コードを少し書き直すことができます。

def addItem(newName, newScore, datafile):
    data = read_database(datafile)
    data[newName] = newScore
    write_database(datafile, data)

def findItemUsingName(nameToFind, datafile):
    data = read_database(datafile)
    return data.get(nameToFind)
于 2013-03-20T18:05:27.510 に答える
0

私は一時ファイルを開いてdatafile、その内容を読み込んでdatafile削除された単語をチェックし、行に問題がなければ一時ファイルに書き込みます。ファイル全体を読んだら、それを削除し、コピーtempして置き換えます。

の関数はshutil、ファイルの削除/移動に適しています (ファイルを削除osするunlink機能もあります)。

import os, shutil

# read one file whilst writing to an intermediate file
with open("datafile.txt", "r") as io, open('temp', 'w') as oo:
    for line in io.readlines():
        if deletedWord not in line.split(':'):
            oo.write('%s' % line)

# delete the original file
os.unlink("datafile.txt")  

# move your new file sans deleted word over to datafile
shutil.move('temp', "datafile.txt")  
于 2013-03-20T17:49:27.343 に答える