Python - подсчет пробелов, а не пустых строк

Есть ли способ сжать текстовый файл и удалить пустые строки, чтобы я мог подсчитать пробелы в тексте? У меня есть текстовый файл примерно из 20 строк, и я хочу посчитать пробелы между словами. Но я думаю, я считаю и белые линии, так как у меня на счетчике больше 800.

def spaces():
"""
Counting spaces
"""

number_of_spaces = 0

with open(TEXT, "r") as fh:
    for line in fh:
        space = line.split()
        for i in space:
            for char in i:
                if char.isspace():
                    number_of_spaces += 1

return number_of_spaces

С Уважением

Итак, вы просто не хотите включать символы новой строки в счетчик?

Ahmad Khan 30.10.2018 10:59
line.split() удаляет пробелы, вы уверены, что получили положительный результат?
Dani Mesejo 30.10.2018 11:01

@MuhammadAhmad Нет, просто пробелы между словами

Thomas Bengtsson 30.10.2018 11:01

@DanielMesejo Я получаю 852 на счетчике, и когда я дал ему приблизительный подсчет, между словами должно быть 150-170 пробелов.

Thomas Bengtsson 30.10.2018 11:03

@ThomasBengtsson не могли бы вы предоставить небольшой пример ввода и соответствующий вывод?

Dani Mesejo 30.10.2018 11:07

Ваш список space содержит слова, извлеченные из line путем разделения на пробелы, поэтому они не содержат пробелов. Итак, если ваш текст не содержит странных символов, которые isspace() будет рассматривать как пробелы, а split() - нет, ваша функция всегда будет возвращать 0, как и в текстах, на которых я ее тестировал. Итак, если вы не можете предоставить нам образец текста, который дает ненулевой результат для вашей функции, я считаю его невоспроизводимым.

Thierry Lathuille 30.10.2018 11:30

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

NOhs 30.10.2018 14:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
2 071
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Что вам нужно сделать, так это посчитать количество слов. Количество пробелов всегда на единицу меньше количества слов.

def spaces():
number_of_spaces = 0
    with open(TEXT, "r") as fh:
        words = [word for line in fh for word in line.split()]
        number_of_spaces = len(words-1)
return number_of_spaces 

Учитываются ли при этом повторяющиеся смежные пробелы?

Dani Mesejo 30.10.2018 11:04

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

NOhs 30.10.2018 13:01

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

Ishara Madhawa 31.10.2018 03:48

Могу ли я предложить разделить ваши строки пробелами и рассчитать ваше пространство как длину полученного массива минус один?

sample_text = """A simple test to see how many
spaces are in these lines of text"""

amount_of_spaces = len(sample_text.split(' ')) - 1
print(amount_of_spaces)
>>> 12

Это хорошо работает с конечными или несколькими последующими пробелами в тексте.

Я бы использовал регулярные выражения для решения этой проблемы:

import re

def spaces(file_name):
    """Return the number of spaces in the text."""
    with open(file_name, 'r') as f:
        return len(re.findall(r' +', f.read()))

Регулярное выражение r' +' будет искать один или несколько последовательных пробелов. Таким образом, двойные пробелы считаются только как один. Другие символы пробела, такие как '\t', игнорируются.

Вы не можете передать файл на findall. Ожидается объект string или bytes-like.

NOhs 30.10.2018 13:07

Хорошее место. Спасибо

WGra 30.10.2018 14:08

Если вы ищете пробелы, почему бы не использовать регулярные выражения:

import re
amountOfWhitespaces = len(re.findall('\x20', yourString)
print(amountOfWhitespaces)

Я думаю, что здесь нет преимущества использования шестнадцатеричного значения вместо более читаемого ' '.

NOhs 30.10.2018 14:31

@NOhs Минусов тоже нет, не так ли? В зависимости от того, сколько строк мы говорим, я бы сказал, что ' ' теряет читаемость. ;-) Кроме того, поскольку вопрос не был очень конкретным о том, какие пробелы он хочет исключить, я считаю, что добавление шестнадцатеричного кода или кода проще, чем `'[,,]'.

Jerome 30.10.2018 14:50

Если вы хотите подсчитать все пробелы отдельно, вы можете использовать встроенную функцию count из String:

with open(TEXT, "r") as fh: 
    count = sum(line.strip().count(' ') for line in fh)

Примечание. При этом используются завершающие пробелы и т. д. С использованием strip, поскольку вы сказали, что хотите подсчитывать только пробелы между словами. Таким образом он также заботится о пустых строках, содержащих пробелы. Он считает двойные пробелы как два отдельных пробела и игнорирует символы табуляции '\t'.

Это зависит от того, что вы пытаетесь сделать, действительно ли это то, чего вы хотите.

Этот код ниже подсчитывает количество пробелов, а также количество строк отдельно. Надеюсь это поможет.

import re
count = 0
fname = input("Enter file name: ")

with open(fname,'r') as f:       #This counts the blank space
    print("Number of space: ", len(re.findall(r' ', f.read())))

with open(fname, 'r') as f:      #This counts the number of lines
    for line in f:
        count += 1
print("Total number of lines is:", (count - 1))

Другие вопросы по теме