Соответствие пустым строкам в файле - PullRequest
0 голосов
/ 30 января 2019

1.Каков наиболее надежный способ сопоставления пустой строки в файле?

2.Какой самый эффективный способ сопоставления пустой строки в файле?

3.Каковы различия между следующими различными способами сопоставления пустой строки?

Контекст:

Я пытаюсь понять некоторые возможные ошибки в процессе обнаружения пустых строк в файле в Python.

Я могу придумать пять способов, которые я определю:

  1. БЛАНКИ: используйте регулярное выражение для совпадения с пустой строкой ^$
  2. NEWLINES: используйте регулярное выражение длясоответствовать символам новой строки ^\r?\n
  3. ПУСТО: соответствовать пустой строке, ''
  4. PNEWLINES: соответствовать символу новой строки, '\n'
  5. ПОЛОСЫ: убратьстрока с 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' эквивалентны?Какой самый лучший способ?Какие еще есть способы?

1 Ответ

0 голосов
/ 30 января 2019

Это похоже на теоретический вопрос, но простой способ следовать этой логике.

with open(file,'r') as out:
    lines = out.readlines()

for line in lines:
    if len(line.strip()) == 0:
        print('Empty')
...