0

テキスト ファイルを読み取り、条件に基づいてデータを 1 行ずつ検索し、その行の値をいくつか変更して別のファイルに書き戻しています。新しいファイルには古い行が含まれていてはなりません。以下を試してみましたが、うまくいきませんでした。私は非常に基本的なことが欠けていると思います。

解決策: C++ では行をインクリメントできますが、Python ではこれを実現する方法がわかりません。だから今のところ、私は新しい行よりも古い行を書いています。しかし、新しいファイルでは、新しい行だけが必要です。

例:

M0 38 A 19 40 DATA2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8
M0 VBN A 19 40 TEMP2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 

私が試したコードは次のとおりです。

def parsefile():
    fp = open("File1", "rb+")
    update_file = "File1" + "_update"
    fp_latest = open(update_file, "wb+")  
    for line in fp:
        if line.find("DATA1") == -1:
            fp_latest.write(line)
        if line.find("DATA1") != -1:
            line = line.split()
            pin_name = find_pin_order(line[1])
            update_line = "DATA " + line[1] + " " + pin_name
            fp_latest.write(update_line)
            line = ''.join(line) 
         if line.find("DATA2") != -1:
            line_data = line.split()
            line_data[1] = "TEMP2"
            line_data =' '.join(line_data)
            fp_latest.write(line_data)
         if line.find("DATA3") != -1:
            line_data = line.split()
            line_data[1] = "TEMP3"
            line_data =' '.join(line_data)
            fp_latest.write(line_data)

 fp_latest.close()
 fp.close()
4

2 に答える 2

1

現在のコードの主な問題は、行が見つからない場合に行ifをチェックして書き出す最初のブロックが、または存在するときに実行されることです。それらには独自のブロックがあるため、ラインは 2 つの異なる形式で複製されます。"DATA1""DATA2""DATA3"

動作するはずのループの最小限の変更を次に示します。

for line in fp:
    if line.find("DATA1") != -1:
        data = line.split()
        pin_name = find_pin_order(data[1])
        line = "DATA " + data[1] + " " + pin_name
    if line.find("DATA2") != -1:
        data = line.split()
        data[1] = "TEMP2"
        line =' '.join(data)
    if line.find("DATA3") != -1:
        data = line.split()
        data[1] = "TEMP3"
        line =' '.join(data)

    fp_latest.write(line)

write()コード内の呼び出しは1 つだけなので、これにより 1 行だけが書き込まれます。特殊なケースでは、書き込まれる行を変更するだけです。そのような場合にあなたがやりたいと思っていた変更を私が理解しているかどうかわからないので、もっとバグがあるかもしれません。

役立つかもしれないことの 1 つは、代わりに2 番目と 3 番目のifステートメントをステートメントにすることです。elifこれにより、そのうちの 1 つだけが実行されることが保証されます (ただし、ファイルがDATA1 行に複数のエントリを持たないことがわかっている場合は、これは必要ないかもしれません)。

于 2013-04-24T15:39:54.090 に答える
1

前回読み取った古い内容を置き換えるファイルに新しい行を書きたい場合は、 file.seek() メソッドを使用してファイル内を移動できます。例があります。

with open("myFile.txt", "r+") as f:
    offset = 0
    lines = f.readlines()
    for oldLine in lines:
            ... calculate the new line value ...
            f.seek(offset)
            f.write(newLine)
            offset += len(newLine)
            f.seek(offset)
于 2013-04-24T15:45:36.027 に答える