2016-04-22 6 views
2

Я новичок с питоном, поэтому любезно прошу задать основной вопрос.string.replace method in python

Я пытаюсь использовать метод string.replace в python и получить странное поведение. вот что я делаю:

# passing through command line a file name 
with open(sys.argv[2], 'r+') as source: 
    content = source.readlines() 

    for line in content: 
     line = line.replace(placeholerPattern1Replace,placeholerPattern1) 
     #if I am printing the line here, I am getting the correct value 
     source.write(line.replace(placeholerPattern1Replace,placeholerPattern1)) 

try: 
    target = open('baf_boot_flash_range_test_'+subStr +'.gpj', 'w') 
     for line in content: 
      if placeholerPattern3 in line: 
       print line 
      target.write(line.replace(placeholerPattern1, <variable>)) 
     target.close() 

Когда я проверяю значения в новом файле, они не заменяются. Я мог видеть, что значение источника также не изменилось, но контент изменился, что я делаю неправильно здесь?

ответ

0

Вы читаете данные из файла source, а также записываете на него. Не делай этого. Вместо этого вы должны написать NamedTemporaryFile, а затем rename над исходным файлом после того, как закончите писать и закройте его.

2

Скорее сделать что-то вроде этого -

contentList = [] 
with open('somefile.txt', 'r') as source: 
    for line in source: 
     contentList.append(line) 
with open('somefile.txt','w') as w: 
    for line in contentList: 
     line = line.replace(stringToReplace,stringToReplaceWith) 
     w.write(line) 
1

Поскольку with закроет файл после того, как подножка все заявления, завернутые в нем, что означает, локальная переменная content будет во втором цикле nil.

0

Попробуйте это:

# Read the file into memory 
with open(sys.argv[2], 'r') as source: 
    content = source.readlines() 
# Fix each line 
new_content = list() 
for line in content: 
    new_content.append(line.replace(placeholerPattern1Replace, placeholerPattern1)) 
# Write the data to a temporary file name 
with open(sys.argv[2] + '.tmp', 'w') as dest: 
    for line in new_content: 
     dest.write(line) 
# Rename the temporary file to the input file name 
os.rename(sys.argv[2] + '.tmp', sys.argv[2])