我需要帮助我不知道如何解决它。
我正在处理文件。基本上我打开一个文件,阅读其中的内容,找一个单词并替换它旁边的单词
我打开了一个文本文件,在这种情况下,我有两个用同一个名称调用的单词,它们分开为PART 1
和PART 2
这是我的car.txt
PART 1
car toyota
PART 2
car toyota
正如您所看到的,我为part
分隔了相同的单词,因此我的脚本将同时查找并在我的模板中显示此内容。
这是它的工作方式
views.py
def car_p1():
file = open("car.txt","r")
content = file.read()
file.close()
car = re.findall('car\s(.*?)\s',open('car.txt','r').read())
if car:
print car
else:
print 'no car found!'
return car[0]
def car_p2():
file = open("car.txt","r")
content = file.read()
file.close()
car = re.findall('car\s(.*?)\s',open('car.txt','r').read())
if car:
print car
else:
print 'no car found!'
return car[1]
def get_items(request):
car = car_p1()
car2 = car_p2()
if 'car' in request.POST:
car_change(request)
return redirect('get_items')
return render(request, 'cars.html', {'car':car, 'car2':car2,})
def car_change(request):
car = car_p1()
car2 = car_p2()
if request.method == 'POST':
change_car = str(request.POST['car_1'])
change_car_2 = str(request.POST['car_2'])
filedata= None
with open('car.txt', 'r') as f:
filedata = f.read()
filedata=filedata.replace(car , change_car , 1)
filedata=filedata.replace(car2 , change_car_2 , 1)
with open('car.txt', 'wb') as f:
f.writelines(filedata)
return render(request, 'cars.html')
这是我的问题。我想将第1部分从丰田改为现代,并且工作正常。 我得到这样的东西
第1部分
汽车hyundai第2部分
汽车丰田
但是如果我想将第2部分从丰田改为现代而未获得第2部分的替换,它将取代我的第1部分..得到这样的东西:
第1部分
汽车hyundai第2部分
汽车丰田
我希望第2部分能够使其工作,因为第1部分......我的代码出了什么问题?
这是我的HTML:
<form method="post" class="" action="">{% csrf_token %}
<label for="car1">CAR 1: </label>
<input id="car1" class="form-control" type="text" name="car_1" value="{{ car }}">
<br>
<label for="car2">CAR 2: </label>
<input id="car2" class="form-control" type="text" name="car_2" value="{{ car2 }}">
<br>
<br>
<input type="submit" name="car" class="btn btn-primary btn-lg btn-block" value="Save">
</form>
希望你能帮助我。
我会给你很多帮助。
感谢!!!
答案 0 :(得分:2)
问题是replace
将仅替换字符串中的前N次出现。如果需要替换第二次出现,可以实现自定义方法,如下所示:
def replace_second_car(filedata, old_car, new_car):
places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
start_place = places[1]
return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
现在您可以像这样使用它:
filedata = replace_second_car(filedata, car2, change_car_2)
答案 1 :(得分:2)
如上所述neverwalkaloner,当您将整个文件读入一个字符串filedata
时,总是会替换第一个匹配项。如果toyota
只出现一次会很好,但会不止一次失败。
您可以为car2从右到左替换filedata
字符串。
将filedata=filedata.replace(car2 , change_car_2 , 1)
更改为filedata=change_car_2.join(filedata.rsplit(car2, 1))