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()分离出我们感兴趣的单词。

--

如果文件可能非常大(逐行处理文件),请使用此代码:

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],

将打印“汉堡”

这将查找字符串“456”后 3 行的第二个单词。它假定单词用逗号 ( ,)分隔

请注意,使用该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
水果
喝
食品、比萨
车
忽略顺序: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 回答