0

シーケンシャルASCIIファイルを読み取り、それらに変更を加えるコードを書いています。

これまでのところ、私はファイルを読み取り、文字列を置き換えることができました。例えば:

import os
import re
parent_folder_path = '.'
for eachFile in os.listdir(parent_folder_path):
    if eachFile.endswith('.sos'):
        newfilePath = parent_folder_path+'/'+eachFile
        file = open(newfilePath, 'r')
        sos = file.read()
        file.close()
        sos = sos.replace('...KOORDSYS -1', '...KOORDSYS 22')
        file = open(newfilePath, 'w')
        file.write(str(sos))
        file.close()

しかし、特定の位置(つまり文字列)を見つけて、その後ろに次の3つの文字列を挿入したいと思います。

.DEF

..DRIFTSMERKING T26

..SPENNING T16

私が使用しているシーケンシャルASCIIファイルの構造は次のようになります。

.HODE
..TEGNSETT ISO8859-1
..TRANSPAR
...KOORDSYS 22
...ORIGO-NØ 0 0
...ENHET 0.01
..OMRÅDE
...MIN-NØ 6593309 455619
...MAX-NØ 6729987 588458
..SOSI-VERSJON 4.0
..SOSI-NIVÅ 2
..DAT0 20130313

私がやりたいのはまさにこれです:

searchline = '..DATO'

lines = f.readlines()
i = lines.index(searchline)
lines.insert(i, '.DEF')
lines.insert(i+1, '..DRIFTSMERKING T26')
lines.insert(i+2, '..SPENNING T16')
4

1 に答える 1

1

あなたは近くにいます。forループを使用して入力行を繰り返し、両方のルールを適用するだけです。この例では、データを追加しますが、ファイルが最初に変換されているかどうかを確認します。

import os
parent_folder_path = '.'
canned_insert = [
    '.DEF' + os.linesep,
    '..DRIFTSMERKING T26' + os.linesep,
    '..SPENNING T16' + os.linesep]
canned_insert_buf = ''.join(canned_insert)
for eachFile in os.listdir(parent_folder_path):
    if eachFile.endswith('.sos'):
        newfilePath = os.path.join(parent_folder_path, eachFile)
        lines = open(newfilePath, 'r').readlines()
        with open(newfilePath, 'w') as f:
            for i, line in enumerate(lines):
                if line.strip() == '...KOORDSYS -1':
                    f.write('...KOORDSYS 22' + os.linesep)
                else:
                    f.write(line)
                    if line.startswith('..DATO') and lines[i+1:i+4] != canned_insert:
                        f.write(canned_insert_buf)
于 2013-03-19T17:04:28.827 に答える