2017-07-13 12 views
1

こんにちは私はPythonを使ってテキスト行を修正するのに問題があります。私は給与計算アプリケーションを作っているし、修正メソッドを働かせることができません。私が検索したエントリが新しいファイルで削除されない理由は分かりません。私は一時にファイルをオーバーコピーしていますし、その後一時ファイルの名前を変更するが、古いエントリはにとどまるPythonを使ってテキストファイルの行を修正するのに助けが必要

def modEmp(): 
    empFile = open("employees.txt", 'r') 
    empFile2= open("temp.txt",'w') 
    line1 = empFile.readline().rstrip("\n") 
    name = input("Enter in your employee name that you would like to modify\n") 
    while line1 != '': 
     line1 = line1.split(" ") #split line into list 
     name = line1[0] + ' ' + line1[1] 
     if name[0] == line1[0] and name[0] == line1[0]: 
      print('Enter the modified entry:\n') 
      list = [0] * 4 
      list [0] = input('Enter first name:\n') 
      list [1] = input('Enter last name:\n') 
      list [2] = input('Enter pay rate:\n') 
      list [3] = input('Enter hours worked:\n') 
      empFile2.write(list[0] + ' ' + list[1] + ' ' + list[2] + ' ' + list[3] + "\n") 

     else: 
      empFile2.write(line1 + "\n") 

     line1 = empFile.readline().rstrip("\n") 
    #Close file 
    empFile.close() 
    empFile2.close() 
    os.remove('employees.txt') 
    os.rename('temp.txt','employees.txt') 
+0

'名前であれば[0] == LINE1 [0]と名前を[0] == LINE1 [0]:' は、これは意味がありません!! ?? – anugrah

+0

字下げを修正しました... –

+1

'name'は文字列です、' line1'は文字列のリストなので、 'name [0] == line1 [0]'は文字を文字列と比較します。 1文字の名前;-) –

答えて

1

いくつかの深刻なあなたのコードに問題があります。あなたが見ている前nameを上書き

name = input("Enter in your employee name that you would like to modify\n") 
... 
    name = line1[0] + ' ' + line1[1] 

は、それで、彼らが入力したものは何でも問題ではありません。

ヒュー・ボスウェルが指摘したように:

line1 = line1.split(" ") #split line into list 
    name = line1[0] + ' ' + line1[1] 
    if name[0] == line1[0] and name[0] == line1[0]: 
nameは単一の文字である場合にのみTrueになります、同じ文字列の最初の文字に文字列を比較しようとします

代わりに、あなたはこのような何かをしたい:私は「

:私は私たちのために、ファイルを閉じると、内蔵for element in list:ループをさせる処理するwithを使用することにより、余分な綿毛の多くをクリーンアップしましたまた、組み込みのlist変数を上書きすることがエラーのレシピであるため、リスト変数の名前をlstに変更しました。

def modEmp(): 
    with open("employees.txt", 'r') as empFile, open("temp.txt", "w") as empFile2: 
     name = input("Enter in your employee name that you would like to modify\n") 
     for line in empFile: 
      if name in line: 
       print('Enter the modified entry:\n') 
       lst = [] 
       lst.append(input('Enter first name:\n')) 
       lst.append(input('Enter last name:\n')) 
       lst.append(input('Enter pay rate:\n')) 
       lst.append(input('Enter hours worked:\n')) 
       empFile2.write("{} {} {} {}\n".format(*lst)) 
      else: 
       empFile2.write(line) 

    # I highly encourage making a backup, as sooner or later 
    # someone will mess it up 
    os.rename('employees.txt', 'employees.bkp') 
    os.rename('temp.txt','employees.txt') 

「請求書」が複数ある場合は、「請求書」を検索すると、両方を変更するように求められます。また、この機能の中断はなく、破壊的であるため、これらの従業員にすでに格納されている情報はすべて失われます。実際の給与計算アプリケーションでは、これは恐らく悲惨です。


また、あなたの代わりに、リスト内の4つの要素を指定するので、それはもう少し再利用可能なようにしたい場合は、以下のことができますプロンプトできるだけ多くの入力をコンパイルします

prompts = ["Enter first name:\n", 
      "Enter last name:\n", 
      "Enter pay rate:\n", 
      "Enter hours worked:\n"] 
empFile2.write(" ".join(map(input, prompts)) + '\n') 

、その後店それらのスペースは、ファイルとしてラインで区切られていますが、あなたがしていることはそれほど明白ではありません。

1

コメントで述べたように、あなたのコードと間違っていくつかのものがあります...

は、そのようなあなたのような状況でwith open(name) as f:構文を使用することgood practiceです。

ここで私はあなたの問題を解決すると信じている解決策です。

def modify(): 
    with open("employees.txt", 'r+') as employee_file: # Opening file in read and write mode 
     temp = employee_file.readlines() # Get all lines 
     employee_file.seek(0) # Reset position in file 

     name = input("Enter in your employee name that you would like to " 
        "modify\n") 

     first, last = name.split(' ') # Assuming this is what you intended 

     for line in temp: 
      # There's no reason to use a list here, and avoid using object names as variables 
      if first in line and last in line: 
       print('Enter the modified entry:\n') 
       first_name = input('Enter first name:\n') 
       last_name = input('Enter last name:\n') 
       pay_rate = input('Enter pay rate:\n') 
       hours = input('Enter hours worked:\n') 

       line_to_write = ' '.join([first_name, last_name, 
              pay_rate, hours]) 
       employee_file.write(line_to_write + "\n") 
      else: 
       employee_file.write(line + "\n") 

     employee_file.truncate() 
+0

あなたは正しい軌道に乗っていますが、まだ問題があります:write() 'first_name、last_name、...'を書いて渡す前に書式を設定する必要があります。改行も挿入する必要があります。最初から最後まで名前を壊してから、別々のインクルードを個別にチェックするのは余分な作業です。また、 'split()'のデフォルトの振る舞いはスペースで動作するため、指定する必要はありません。将来的にはコードを実行して正確性を確認することをお勧めします。 – TemporalWolf

+0

@TemporalWolf 'write'と' split'についての注意をお寄せいただきありがとうございます。しかし、改行を挿入する必要はありません。 – flevinkelming

+0

[repl.it](https://repl.it/J1GA/0)は同意しません。 'file.write()'は、それぞれの呼び出しの末尾に改行を挿入しません。 – TemporalWolf

関連する問題