Как удалить последний символ в файле
Различные типы методов в строке для удаления или удаления последнего символа из строки в Python, такие как положительный, отрицательный индекс, rstrip и т. Д.
Вступление
Манипуляция строками-самая важная функция python. Вы можете манипулировать строкой с помощью многих методов, таких как методы нарезки строк, циклического перебора элементов и методы строк. Иногда мы приходим к ситуации, когда нам требуется удалить последний символ из строки в Python, так как он добавлен по ошибке. Поэтому здесь мы сосредоточимся на удалении последнего символа из строки.
Различные способы удаления последнего символа из строки в Python
Давайте обсудим некоторые методы, с помощью которых мы можем удалить или удалить последний символ из строки:
1. Использование положительного индекса путем нарезки
Мы можем удалить или удалить последний символ из строки, обратившись к положительному индексу данной строки.
Давайте рассмотрим пример для лучшего понимания концепции:
Выход:
Здесь мы взяли пример строки. Затем мы вычислили длину строки, чтобы получить доступ к последнему символу строки. Наконец, мы использовали нарезку для удаления последнего символа строки, а затем напечатали вывод. Следовательно, мы видели, что нежелательный персонаж был удален.
2. Использование отрицательного индекса путем нарезки
Мы также можем удалить или удалить последний символ из строки, обратившись к отрицательному индексу данной строки.
Давайте рассмотрим пример для лучшего понимания концепции:
Здесь мы взяли пример строки, а затем для удаления последнего символа строки индексация всегда начинается с -1. Отрезав его от индекса -1, мы удалили последний символ строки. Наконец-то мы напечатали результат. Следовательно, мы видели, что нежелательный персонаж был удален.
3. Использование функции rstrip для удаления последнего символа из строки в Python
Строковый метод rstrip используется для удаления символов из правой части заданной ему строки. Поэтому мы будем использовать его для удаления или удаления последнего символа строки. Это можно сделать только в одной строке кода и простым методом удалить последний символ из строки.
Давайте рассмотрим пример для лучшего понимания концепции:
Здесь, во-первых, мы взяли входные данные от пользователя в виде строки. Во-вторых, мы использовали функцию rstrip в данной строке и использовали ее для удаления последнего символа из строки. Наконец-то мы напечатали результат. Следовательно, мы видели, что нежелательный персонаж был удален.
4. Использование цикла for для удаления последнего символа из строки в Python
Мы также можем использовать цикл for для удаления или удаления последнего символа из строки. Мы выведем длину строки из функции len (). Тогда мы возьмем пустую строку. После этого мы запустим цикл от 0 до l2 и добавим строку в пустую строку. Наконец, мы напечатаем вывод в виде оставшейся строки.
Давайте рассмотрим пример для лучшего понимания концепции:
5. Использование функции regex
Мы можем использовать функцию regex() в python, чтобы сопоставить 2 группы в строке, т. е.
- Группа 1: Каждый символ в строке, кроме последних символов.
- Группа 2: Последний символ строки.
Давайте рассмотрим пример для лучшего понимания концепции:
Кроме того, Читайте > > 7 Способы удаления символов из строки в Python
Вывод
В этом уроке мы узнали обо всех методах, с помощью которых мы можем удалить или удалить последний символ строки. Все методы подробно объясняются с помощью примеров. Основным и самым простым методом было использование положительных и отрицательных индексов. Вы можете использовать любой из методов, которые вам нравятся, в соответствии с требованиями вашей программы или проекта.
Однако, если у вас есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.
1 EXIT /b for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=а" "Б=б" "В=в" "Г=г" "Д=д" "Е=е" "Ж=ж" "З=з" "И=и" "К=к" "Л=л" "М=м" "Н=н" "О=о" "П=п" "Р=р" "С=с" "Т=т" "У=у" "Ф=ф" "Х=х" "Ц=ц" "Ч=ч" "Ш=ш" "Щ=щ" "Ь=ь" "Ы=ы" "Ъ=ъ" "Э=э" "Ю=ю" "Я=я") do ( call set %
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером - 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 "Old String" "New String" < infile > outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.
Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
<nul set /p a=text В данном случае, слово text (а здесь может быть и переменная) будет выведено но экран без перевода строки. Значение переменной a при этом не будет изменено (если это для вас важно).
Соответственно, для вывода текста в файл без перевода строки используется конструкция:
<nul set /p a=text>b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
1 :startvarcount if not defined var exit /b set var=%var:
1% set /a %2+=1 goto startvarcount exit /b
set st=abcdefghijklmnopqrstuvwxyz . call :var_сount2 %st% count2 echo %count2%Еще один вариант вычисления длины строковой переменной:
:StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0 Set $StringBuf=%1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:
%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно - достаточно быстрый:
n0.tmp" For %%i In ("%TEMP%\%
n0.tmp") Do Set /A z=%%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
:strLen string len -- returns the length of a string :: -- string [in] - variable name containing :: the string being measured for length :: -- len [out] - variable to be used :: to return the string length :: Many thanks to 'sowgtsoi', but also 'jeb' :: and 'amel27' dostips forum :: users helped making this short and efficient :$created 20081122 :$changed 20101116 :$categories StringOperation :$source http://www.dostips.com ( SETLOCAL ENABLEDELAYEDEXPANSION set "str=A!%1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set "len=0" for /L %%A in (12,-1,0) do ( set /a "len|=1%<<%%A" for %%B in (!len!) do ^ if "!str:
1<<%%A" ) ) ( ENDLOCAL & REM RETURN VALUES IF "%
set "string=12345678901234 " call :strLen string len echo len=%len%Для себя я так же использую метод половинного деления для нахождения количества символов в строке. Эта процедура менее изящна, и, возможно, потребует несколько большего времени для вычислений, чем приведенная выше, но, на мой взгляд, она понятнее. (В этом месте надо было похвалить себя еще, но что-то не нашлось достойных эпитетов)
Привожу на всякий случай и эту процедуру ))
!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %
2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
Если же одна или обе эти величины - переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:
Или как вариант предыдущего
setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set str=zaq12wsx set n1=3 set n2=6 call :SUBSTRING str,%n1%,%n2% echo %SUBD% . :SUBSTRING set SUBD=!%1:Удаление ведущих и замыкающих пробелов.
:ALLTRIM :: ----------------------- :: Krasner B. :: ----------------------- :: %1 - var with txt string :: ----------------------- SetLocal EnableDelayedExpansion set /a firstnoblank=-1 set /a lastnoblank=0 set /a curpos=1 set "str=Q!%1!" :StringLenLoop set SUBD=!str:%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez primer"> set "strr=" Call :ALLTRIM strr echo result ALLTRIM ^>%strr%^< . set "strrr= 22 33 " Call :ALLTRIM strrr echo result ALLTRIM ^>%strrr%^<
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
скажем, у меня есть произвольный многострочный текстовый файл:
Как я могу удалить только последний символ (e, а не новую строку или null) файла, не делая текстовый файл недействительным?
более простой подход (выводит в stdout, не обновляет входной файл):
- $ - Это адрес Sed, который соответствует только последней строке ввода, что вызывает следующий вызов функции ( s/.$// ) для выполнения только в последней строке.
- s/.$// заменяет последний символ на (в данном случае последние строка) с пустой строкой, т. е. эффективно удаляет последний символ. (перед новой строкой) на линия.
. соответствует любому символу на линии, и после него с $ закрепляет матч до конца линии; обратите внимание, как использование $ в этой регулярные выражения концептуально связаны, но технически отличается от предыдущего использования $ как Sed адрес.
пример с вводом stdin (предполагает Bash, Ksh или Zsh):
до обновить входной файл тоже (не использовать, если входной файл является символической ссылкой):
Примечание:
* На OSX вам придется использовать -i '' вместо -i ; для обзора подводных камней, связанных с -i , смотрите нижнюю половину мой ответ здесь.
* Если вам нужно обработать очень большие входные файлы и/или производительность / использование диска являются проблемой и вы используете GNU утилиты (Linux), см. sorontar ответ.
truncate
удаляет один (-1) символ из конца того же файла. Точно как >> будет добавить в тот же файл.
проблема с этим подходом заключается в том, что он не сохраняет пустую строку, если она существует.
это работает, потому что хвост принимает последний байт (не char).
это почти не занимает времени даже с большими файлами.
почему не sed
проблема с решением sed, как sed '$ s/.$//' file это то, что он сначала читает весь файл (занимает много времени с большими файлами), затем вам нужен временный файл (того же размера, что и оригинал):
а затем переместите tempfile для замены файла.
вот еще одно использование ex , который я нахожу не таким загадочным, как решение sed:
на $ идет к последней строке, s удаляет последний символ, и wq является хорошо известным (для пользователей vi) write + quit.
после целого ряда игр с различными стратегиями (и избегая sed-i или perl), лучший способ, который я нашел, чтобы сделать это:
Если цель состоит в том, чтобы удалить последний символ в последней строке, это awk надо сделать:
Он хранит все данные в массив, затем распечатывает его и изменяет последнюю строку.
ОТРЕДАКТИРОВАННЫЙ ОТВЕТ
Я создал скрипт и поместил ваш текст на свой рабочий стол. этот тестовый файл сохраняется как "old_file.txt"
после этого я написал небольшой скрипт, чтобы взять старый файл и устранить последний символ в последней строке
открыв созданный мною файл new_file, показал вывод следующим образом:
прошу прощения за мой предыдущий ответ (не читал внимательно)
просто замечание: sed временно удалит файл. Поэтому, если вы отслеживаете файл, вы получите предупреждение "нет такого файла или каталога", пока не переиздадите команду tail.
Скажем, у меня есть несколько произвольных многострочных текстовых файлов:
Как удалить только последний символ (e, а не новую строку или нуль) файла, не делая текстовый файл недействительным?
Более простой подход (выходы на stdout, не обновляет входной файл):
- $ - это Sed-адрес, который соответствует только последней строке ввода, что вызывает выполнение следующего вызова функции ( s/.$// ) только в последней строке.
- s/.$// заменяет последний символ строки (в данном случае последней) пустой строкой; то есть эффективно удаляет последний char. (перед новой строкой) на линии.
. соответствует любому символу в строке, а после него с $ привязывает соответствие к концу строки; обратите внимание, как использование $ в этом регулярном выражении концептуально связано, но технически отличается от предыдущего использования $ в качестве Sed-адреса.
Пример со входом stdin (предполагается Bash, Ksh или Zsh):
Также обновить файл ввода (не использовать, если входной файл является символической ссылкой):
Примечание:
* В OSX вам нужно будет использовать -i '' вместо -i ; для обзора подводных камней, связанных с -i , см. нижнюю часть моего ответа здесь.
* Если вам нужно обрабатывать очень большие входные файлы и/или производительность/использование диска, вы беспокоитесь, и вы используете утилиты GNU (Linux), см. отзыв о сотернаре.
truncate
Удаляет один (-1) символ из конца того же файла. Точно, как >> будет добавляться в тот же файл.
Проблема с этим подходом заключается в том, что он не сохраняет конечную новую строку, если она существует.
Это работает, потому что tail принимает последний байт (не char).
Для больших файлов требуется почти время.
Почему бы не sed
Проблема с решением sed, например sed '$ s/.$//' file , заключается в том, что он сначала считывает весь файл (длительное время с большими файлами), тогда вам нужен временный файл (того же размера, что и оригинал):
Читайте также: