在python中浏览文本文件

时间:2012-08-21 23:42:09

标签: python text line

我有一个包含以下内容的文本文件:

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出现的行。如何阅读456下面的3行,然后访问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')

现在如何将所有内容写回新文件?

3 个答案:

答案 0 :(得分: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],

将打印“BURGER”

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

请注意,使用with构造还会在完成后(或者如果遇到异常)关闭文件。

答案 1 :(得分: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

这将为您提供文件中的正确行,您将可以访问其前面的数字。要编辑文件,请查看this等解决方案。

如果您只对文本流感兴趣。您可以在打印后添加line.replace('BURGER', 'FOO')

答案 2 :(得分: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

修改

我已经编辑了代码,以明确它当前如何读取您的文件。输出现在是:

Ignoring order: NUM,123
FRUIT
DRINK
FOOD,BACON
CAR
Changing order: NUM,456
FRUIT
DRINK
FOOD,Pizza
CAR
Ignoring order: NUM,789
FRUIT
DRINK
FOOD,SAUSAGE
CAR