我有一个包含以下内容的文本文件:
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')
现在如何将所有内容写回新文件?
答案 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