0

次のテキストファイルがあります。

NUM,123
FRUIT
DRINK
FOOD,BACON
CAR
NUM,456
FRUIT
DRINK
FOOD,BURGER
CAR
NUM,789
FRUIT
DRINK
FOOD,SAUSAGE
CAR

私は変更しようとしてBURGERいますが、それを行う方法は?

file = open('input.txt', 'r')
while True:
    line = file.readline()
    if '456' in line:
        print line
        break

上記のコードでは、の後の個別の番号を使用してそれを特定したいのですNUMが、発生した行しか読み取ることができません456。以下の3行を読んで、その部分456にアクセスするにはどうすればよいBURGERですか?

ありがとう!

Levonのソリューションを使用して更新します。

with open('input.txt','r') as f:
    data = f.readlines()
    for i, line in enumerate(data):
        if '456' in line:
            field = ','.join(data[i+3].split(',')[1])
            field = field.replace(field,'PIZZA')

では、どのようにしてすべてを新しいファイルに書き戻しますか?

4

3 に答える 3

2

以下のコメントに基づいて更新します。

すべてのファイルがメモリに収まる(すべてのファイルを一度に読み取る)場合は、このコードを使用します。

with open("data.txt") as f:
    data = f.readlines()
    for i, line in enumerate(data):
        if "456" in line:
            print data[i+3].split(',')[1],

ファイル全体をリスト(data)に読み込み、 enumerate()iを使用して、インデックス( )と、指定されたインデックスの要素(つまり、)の両方にアクセスしますline。リストにすべてのデータがあるので、「456」の行を見つけたら、リストでi + 3非常に簡単にその行を検索し、 split()を使用して目的の単語を分離できます。

-

ファイルが潜在的に非常に大きい場合(ファイルを1行ずつ処理する場合)にこのコードを使用します。

with open("data.txt") as f:
    count = -1
    for line in f:
        if "456" in line:
            count = 4

        count -= 1
        if count == 0:
            print line.split(',')[1],

「BURGER」を印刷します

これは、文字列「456」の3行後の2番目の単語を検索します。,単語がコンマ( )で区切られていることを前提としています

コンストラクトを使用すると、with完了時(または例外が発生した場合)にファイルを閉じることもできます。

于 2012-08-21T23:45:24.017 に答える
0

テキストファイルには構造があります。たとえば、誰かが注文をピザに変更できるようにするために、その構造を読み取る方法を本当に求めていると思います。

input.txtにはいくつかの注文があります。各注文は注文番号(NUM、456など)で始まり、次にいくつかのアイテムがありCAR、ドライブスルーの人が注文を完了したことを示すかのようになります。

したがって、ステップ1。

# changes order 456's food to a pizza, from whatever it was
file = open('input.txt', 'r')

bad_order = 'NUM,%d' % 456
new_food = 'FOOD,%s' % 'Pizza'

change = False
for line in file:
  line = line.strip()
  msg = ''
  if line.startswith('NUM,'):
    msg = 'Ignoring order: '
  if line == bad_order:
    msg = 'Changing order: '
    change = True
  if change and line.startswith('FOOD,'):
    line = new_food
  if line == 'CAR':
    change = False
  print '%s%s' % (msg, line)

さらなるステップは、構造をより正式に認識することかもしれません(例えば、後で処理するためにコレクションに注文を追加します)。または、これを関数にリファクタリングして、だけでなく、さまざまな注文番号やさまざまな食品タイプの変更をテストできるようにしますFOOD

編集

コードを編集して、現在ファイルをどのように読み取るかを明確にしました。出力は次のようになります。

順序を無視する:NUM、123
フルーツ
飲む
食品、ベーコン
車両
順序の変更:NUM、456
フルーツ
飲む
FOOD、Pizza
車両
注文を無視する:NUM、789
フルーツ
飲む
食品、ソーセージ
車両
于 2012-08-22T00:23:02.967 に答える
0

試す:

file = open('input.txt', 'r')
for line in file.readlines():
    if '456' in line:
        stored_line = line
    if 'BURGER' in line:
        print stored_line

これにより、ファイル内の正しい行が表示され、その前の番号にアクセスできるようになります。その場でファイルを編集するには、次のような解決策を探してください

テキストストリームに興味がある場合。印刷後に追加できますline.replace('BURGER', 'FOO')

于 2012-08-21T23:44:31.547 に答える