1.Каков наиболее надежный способ сопоставления пустой строки в файле?
2.Какой самый эффективный способ сопоставления пустой строки в файле?
3.Каковы различия между следующими различными способами сопоставления пустой строки?
Контекст:
Я пытаюсь понять некоторые возможные ошибки в процессе обнаружения пустых строк в файле в Python.
Я могу придумать пять способов, которые я определю:
- БЛАНКИ: используйте регулярное выражение для совпадения с пустой строкой
^$
- NEWLINES: используйте регулярное выражение длясоответствовать символам новой строки
^\r?\n
- ПУСТО: соответствовать пустой строке,
''
- PNEWLINES: соответствовать символу новой строки,
'\n'
- ПОЛОСЫ: убратьстрока с
strip()
, а затем соответствует пустой строке.
[nav] In [3]: i = 0
...: fin = open('warandpeace.txt', 'rt')
...: blanks = []
...: empties = []
...: newlines = []
...: pnewlines = []
...: strips = []
...: NEWLINE = re.compile(r'^\r?\n')
...: BLANK = re.compile(r'^$')
...: for line in fin:
...: if re.search(BLANK, line):
...: blanks.append((i, line))
...: if re.search(NEWLINE, line):
...: newlines.append((i, line))
...: if line == '':
...: empties.append((i, line))
...: if line == '\n':
...: pnewlines.append((i, line))
...: if line.strip == '':
...: strips.append((i, line))
...: i += 1
[nav] In [4]: print((len(blanks), len(empties), len(newlines), len(pnewlines), len(strips)))
(13892, 0, 13892, 13892, 0)
Они делают не , кажется, эквивалентно, хотя я получил единообразные результаты.Мой ввод - текстовая копия UTF-8 «Войны и мира» Льва Толстого из «Проекта Гутенберга» , я думаю, с окончаниями строк в Windows.Я не уверен, что еще для тестирования.
Я наблюдаю следующее:
- Bboth BLANKS и NEWLINES будут кроссплатформенными переносимыми (т.е. смогут обрабатывать окончания строк Windows(На самом деле я не знаю о Mac).
- Метод EMPTIES явно не работает, поскольку при чтении строк из файла сохраняется
\n
, и поэтому он не является пустой строкой. - Метод PNEWLINES завершится ошибкой в случае окончания строки в Windows.
- Я понятия не имею, почему метод STRIPS дает сбой. Я думал, что он удаляет начальные и конечные пробелы, поэтому он должен работать.
- Все они потерпят неудачу, если в пустой строке есть пробелы, что легко исправить в случае методов регулярных выражений (не связанных с этим случаем).
Кто яЭто самый надежный метод для сопоставления пустых строк. Я всегда использовал '^$'
с sed, но в Python я, честно говоря, даже не понимаю, как строки разбиваются в первую очередь! Это кажется странным идля меня неинтуитивно понятно, что новая строка сохраняется несмотря на расщепление Python на новой строке.
Каковы реальные различия между всеми этими, кроме поверхностных.Например, почему '^$'
и '^\r?\n'
эквивалентны?Какой самый лучший способ?Какие еще есть способы?