-5

従業員レコードのファイルを 1 行ずつ反復処理し、"?" でマークされた従業員レコードの末尾にあるファイルに新しい行 (勤務シフトのレコード) を挿入しようとしています。

したがって、基本的に私のファイルは次のようになります。

スタッフ ##### !
ジョー・スミス
従業員
1 シフト
2 シフト
?
!
Jane Smith
時折のボランティア

1 シフト
2 シフト
3 シフト
?
@

...そして、例えば、ジェーン・スミスのレコードに「第 4 シフト」を追加したいと思います。ファイルの作業コピーを反復処理し、(フラグを使用して) Jane のレコードを見つけ、現在の行の後続行 (行 -> 次 ??) が "?" の場合にこれを実行したいと思います。私の現在の行は、ジェーンが最後に記録したシフトであることを知っています。次に、古いファイルの残りを新しいファイルにコピーし続ける前に、「第 4 シフト」行に書き込むことができます。

これらすべての行を繰り返し処理しているときに、実際にスキップせずに次の行を (「?」をチェックするために) 読み取るにはどうすればよいでしょうか?

4

1 に答える 1

1

とにかく、基本的にファイルの途中に行を挿入することはできません。代わりに、新しい行を含む新しいファイルで古いファイルを上書きする必要があります。したがって、解決策は次のようになります。

  1. ファイルを読み取り用に開きます。
  2. 特定の行に挿入しやすくするために、できれば行ごとにファイルの内容を保存します。
  3. 保存した内容に新しい行を挿入します。
  4. 今度は書き込みモードでファイルを再度開き、保存した変更内容でその内容を上書きします。

したがって、あなたの例では、フラグのアイデアを使用して挿入ポイントを見つけるには、次のようにします。

#Step 1
with open('testFile', 'r') as f:
    #Step 2
    contentList = f.readlines()

#Step 3
isJane = False # <-- flag
i = 0
insertIndex = None # used to avoid changing the list while looping over it
for line in contentList:
    if 'jane' in line.lower():
        isJane = True
    if isJane and line.strip() == '?':
        insertIndex = i
    i += 1
contentList.insert(insertIndex, 'fourth shift\n')

#Step 4
with open('testFile', 'w') as f:
    f.writelines(contentList)

もっと短い方法もありますが、おそらくこれが最も簡単です。

于 2012-09-01T21:04:17.290 に答える