2017-02-09 26 views
0

我需要幫助我不知道如何解決它。Django - 沒有按預期取代我的字符串

我正在處理文件。基本上我打開一個文件,閱讀它裏面的內容,尋找一個詞,並替換它旁邊的單詞

我打開一個文本文件,在這種情況下,我有兩個詞用相同的名稱,他們分開PART 1PART 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') 

這裏是我的問題。我想從豐田改爲現代的第一部分,並行得通。 我得到這樣的

PART 1

車現代

PART 2

車豐田

,但如果我想從豐田改變部分2到現代將不會取代第2部分,它將取代我的part1 ..得到這樣的事情:

PART 1

車現代

PART 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> 

希望你能幫助我。

我會給你很多幫助。

謝謝!

回答

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) 
+0

OP返回車[1]在car_p2()因此只出現一次。 OP的替換功能正常工作 – haifzhan

+0

@HaifengZhang OP的初始文件包含兩行:'car toyota'。他試圖只替換其中的第二個。 – neverwalkaloner

+0

car_p1()返回PART1區域的豐田,car_p2()返回PART2區域的豐田區域 – haifzhan

2

正如neverwalkaloner提到的,你隨時更換1號當您將整個文件讀入一個字符串filedata時發生。如果toyota只出現一次,但會在多次失敗時失敗。

您可以從car2的從右到左替換filedata字符串。

變化filedata=filedata.replace(car2 , change_car_2 , 1)filedata=change_car_2.join(filedata.rsplit(car2, 1))