【问题标题】:Navigating through text file in python在python中浏览文本文件
【发布时间】:2012-08-21 23:42:09
【问题描述】:

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

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')

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

【问题讨论】:

    标签: python text line


    【解决方案1】:

    更新基于以下评论:

    如果所有文件都可以放入内存(一次读取所有个文件),请使用此代码:

    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 构造还负责在我们完成(或遇到异常)时关闭文件。

    【讨论】:

    • 在你的情况下,你用“BURGER”来定位它,我想做的是用“456”来定位它,然后阅读它下面的 3 行并替换“第二个单词”这是“汉堡”
    • @user1546610 所以你正在寻找第二个单词 3 行之后你看到字符串“456”?但是您不一定要更改该字符串,对吗?
    • @user1546610 你只想打印/访问那个特定的字符串,而不是别的吗?
    • 是的,打印/访问那个就可以了。谢谢。
    • +1,对于初学者来说,过于复杂是没有用的(我会使用 csv/itertools 来制作记录分组器:^)——但当我看到 'string in由于“NUM,4567”的问题,otherstring'构造。
    【解决方案2】:

    试试:

    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')

    【讨论】:

    • 存在无限循环的小问题?
    【解决方案3】:

    您的文本文件具有结构。我想您确实是在寻求一种读取该结构的方法,例如,以便某人能够将他们的订单更改为披萨。

    您的 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 水果 喝 食品、香肠 车

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2011-08-14
      • 1970-01-01
      • 2013-11-25
      • 2012-03-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多