редактирование одной строки .txt в Python 3.1 - PullRequest
2 голосов
/ 19 февраля 2011

У меня есть некоторые данные, хранящиеся в файле .txt в этом формате:

----------|||||||||||||||||||||||||-----------|||||||||||
1029450386abcdefghijklmnopqrstuvwxy0293847719184756301943
1020414646canBeFollowedBySpaces    3292532113435532419963

не спрашивай ...

У меня есть много строк, и мне нужен способ добавить больше цифр в конец конкретной строки.

Я написал код, чтобы найти нужную строку, но я озадачен тем, как добавить 11 символов в конец. Я осмотрелся, этот сайт помог мне с некоторыми другими проблемами, с которыми я столкнулся, но я не могу найти то, что мне нужно для этого.

важно, чтобы строка сохранила свою позицию в файле, а ее содержимое - в текущем порядке.

используя python3.1, как бы вы включили это:

1020414646canBeFollowedBySpaces    3292532113435532419963

в

1020414646canBeFollowedBySpaces    329253211343553241996301846372998

Ответы [ 4 ]

6 голосов
/ 19 февраля 2011

Как правило, нет никаких ярлыков для «вставки» новых данных в середину текстового файла.Вам нужно будет сделать копию всего исходного файла в новом файле, изменяя желаемые строки текста на пути.

Например:

with open("input.txt") as infile:
    with open("output.txt", "w") as outfile:
        for s in infile:
            s = s.rstrip() # remove trailing newline
            if "target" in s:
                s += "0123456789"
            print(s, file=outfile)
os.rename("input.txt", "input.txt.original")
os.rename("output.txt", "input.txt")
4 голосов
/ 19 февраля 2011

Извлеките модуль fileinput , он может выполнять своего рода "редактирование" на месте с файлами.хотя я считаю, что временные файлы все еще участвуют во внутреннем процессе.

import fileinput

for line in fileinput.input('input.txt', inplace=1, backup='.orig'):
    if line.startswith('1020414646canBeFollowedBySpaces'):
        line = line.rstrip() + '01846372998' '\n'
    print(line, end='')

print теперь печатает файл вместо консоли

Возможно, вы захотите сделать резервную копию исходного файла перед редактированием.

2 голосов
/ 19 февраля 2011
target_chain = '1020414646canBeFollowedBySpaces    3292532113435532419963'
to_add = '01846372998'

with open('zaza.txt','rb+') as f:
    ch = f.read()
    x = ch.find(target_chain)
    f.seek(x + len(target_chain),0)
    f.write(to_add)
    f.write(ch[x + len(target_chain):])

В этом методе абсолютно обязательно открыть файл в двоичном режиме 'b' по какой-то причине, связанной с обработкой конца строк в Python (см. Universal Newline, включен по умолчанию))

Режим 'r +' разрешает запись и чтение

. В этом методе то, что находится до target_chain в файле, остается неизменным.И то, что после target_chain сдвигается вперед.Как сказал Грег Хьюгилл, на жестком диске невозможно раздвинуть биты, чтобы вставить новые биты посередине.

Очевидно, что если файл очень большой, все его содержимое читается в ch может занимать слишком много памяти, и алгоритм должен быть изменен: чтение строки за строкой до строки, содержащей target_chain, а затем чтение следующей строки перед вставкой, а затем продолжение «чтения следующей строки - повторно- писать в текущей строке "до конца файла, чтобы постепенно сдвигать содержимое из строки, связанной с добавлением.

Вы понимаете, что я имею в виду ...

0 голосов
/ 19 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...