2016-11-17 2 views
1

Ниже моей замены функции строки:Python: Заменить строки очистное все после строки

def replace_line(file_name, num, replaced): 
    f = open(file_name, 'r', encoding='utf-8') 
    lines = f.readlines() 
    lines[num] = replaced 
    f.close() 
    f = open(file_name, 'w', encoding='utf-8') 
    f.writelines(lines) 
    f.close() 

Я использую эту следующую строку, чтобы запустить свой код:

replace_line('Store.txt', int(line), new) 

Когда я запускаю мой код, он заменяет эту строку, однако она также удаляет все после этой строки. Например, если это был мой список:

+0

Я хочу изменить определенную строку. Я получил исходную функцию замены строки из [здесь] (http://stackoverflow.com/a/4719576/5985905). Однако позже он изменился из-за [этого] (http://stackoverflow.com/questions/40621799/python-unicodedecodeerror-ascii-codec-cant-decode-byte-0xef-in-position-0/40622844?noredirect=1# comment68504472_40622844) –

+0

Не могли бы вы показать код до 'replace_line ('Products.txt', int (строка [i]), tenminus_str)'? – lucasnadalutti

+0

Почему вы открываете тот же файл дважды? Я не вижу, что f используется в строках 1-5 – themistoklik

ответ

1

Если честно, я не уверен, что случилось с исходной функцией. Но я пытался переделать его, и это, кажется, работает нормально:

def replace_line(file_name, line_num, text): 
    with open(filename, 'r+') as f: 
     lines = f.read().splitlines() 
     lines[line_num] = text 
     f.seek(0) 
     f.writelines(lines) 
     f.truncate() 

Пожалуйста, обратите внимание, что это переписывает весь файл. Если вам нужно обрабатывать большие файлы или использовать память, вам может понадобиться попробовать другой подход.

+1

Так как мой ответ подобен вашему, позвольте мне указать на то, что в соответствии с логикой, которую хочет OP, достигается с помощью 'with open (имя файла, 'r +') как f: lines = f.readlines() для i в диапазоне (0, len (lines), 3): , если int (строки [i] .replace ('\ n', '')) <= 2: строки [i] = str (10) + '\ n' f.seek (0) f.writelines (lines) f.truncate() ' – themistoklik

+1

@NamenotFound' range (0, len (lines), 3) не проходит только 1-3, он начинается с 0 до длина массива строк с шагом 3. Я не понимаю, что вы имеете в виду. Это полный фрагмент (если вы помещаете его внутри функции), который при задании файла заменит его содержимое так, как вы указали. Просто подайте его в файл и посмотрите, делает ли он то, что вы хотите. Если вы не уверены в том, где он вписывается в ваш код, запустите его самостоятельно и измените свой код для работы с обработанным файлом. – themistoklik

+1

Для вашего конкретного файла я бы сделал диапазон, начинающийся с 2 и 3-го числа, так как я могу ожидать увидеть только ints в этих строках. Ошибка, которую вы получаете, - это потому, что я не обращал внимания на структуру вашего файла и int() применяется к строке, 'product1' – themistoklik