Есть ли способ сжать текстовый файл и удалить пустые строки, чтобы я мог подсчитать пробелы в тексте? У меня есть текстовый файл примерно из 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
С Уважением
line.split() удаляет пробелы, вы уверены, что получили положительный результат?
@MuhammadAhmad Нет, просто пробелы между словами
@DanielMesejo Я получаю 852 на счетчике, и когда я дал ему приблизительный подсчет, между словами должно быть 150-170 пробелов.
@ThomasBengtsson не могли бы вы предоставить небольшой пример ввода и соответствующий вывод?
Ваш список space содержит слова, извлеченные из line путем разделения на пробелы, поэтому они не содержат пробелов. Итак, если ваш текст не содержит странных символов, которые isspace() будет рассматривать как пробелы, а split() - нет, ваша функция всегда будет возвращать 0, как и в текстах, на которых я ее тестировал. Итак, если вы не можете предоставить нам образец текста, который дает ненулевой результат для вашей функции, я считаю его невоспроизводимым.
Я повторяю запрос @DanielMesejo. Нам нужно знать, должны ли учитываться двойные пробелы, должны ли учитываться другие символы пробелов, такие как позиции табуляции и т. д.






Что вам нужно сделать, так это посчитать количество слов. Количество пробелов всегда на единицу меньше количества слов.
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
Учитываются ли при этом повторяющиеся смежные пробелы?
Но при этом новые строки считаются пробелами, поскольку две строки по два слова в каждой дадут три пробела, но текст содержит только два пробела и символ новой строки.
Я думаю, что OP хочет рассматривать каждую новую строку как пробел. Он мог получить ответ, который искал, из этого ответа. Вот почему он принял ответ.
Могу ли я предложить разделить ваши строки пробелами и рассчитать ваше пространство как длину полученного массива минус один?
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.
Хорошее место. Спасибо
Если вы ищете пробелы, почему бы не использовать регулярные выражения:
import re
amountOfWhitespaces = len(re.findall('\x20', yourString)
print(amountOfWhitespaces)
Я думаю, что здесь нет преимущества использования шестнадцатеричного значения вместо более читаемого ' '.
@NOhs Минусов тоже нет, не так ли? В зависимости от того, сколько строк мы говорим, я бы сказал, что ' ' теряет читаемость. ;-) Кроме того, поскольку вопрос не был очень конкретным о том, какие пробелы он хочет исключить, я считаю, что добавление шестнадцатеричного кода или кода проще, чем `'[,,]'.
Если вы хотите подсчитать все пробелы отдельно, вы можете использовать встроенную функцию 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))
Итак, вы просто не хотите включать символы новой строки в счетчик?