Найти количество символов в файле с помощью Python

Вот вопрос:

У меня есть файл с этими словами:

hey how are you
I am fine and you
Yes I am fine

И попросят найти количество слов, строк и символов.

Ниже моя программа, но количество отсчетов для символов без пробела неверно.

Количество слов верное и количество строк правильное. Какая ошибка в том же цикле?

fname = input("Enter the name of the file:")
infile = open(fname, 'r')
lines = 0
words = 0
characters = 0
for line in infile:
    wordslist = line.split()
    lines = lines + 1
    words = words + len(wordslist)
    characters = characters + len(line)
print(lines)
print(words)
print(characters)

Вывод:

lines=3(Correct)
words=13(correct)
characters=47

Я просмотрел сайт с несколькими ответами, и я смущен, потому что не изучил некоторые другие функции в Python. Как исправить код как простой и простой, как в цикле, который я сделал?

В то время как количество символов без пробела равно 35 и с пробелом 45. Если возможно, я хочу найти количество символов без пробела. Даже если кто-то знает цикл для количества символов с достаточным пространством.

Ответы

Ответ 1

Суммируйте длину всех слов в строке:

characters += sum(len(word) for word in wordslist)

Вся программа:

with open('my_words.txt') as infile:
    lines=0
    words=0
    characters=0
    for line in infile:
        wordslist=line.split()
        lines=lines+1
        words=words+len(wordslist)
        characters += sum(len(word) for word in wordslist)
print(lines)
print(words)
print(characters)

Вывод:

3
13
35

Это:

(len(word) for word in wordslist)

является выражением генератора . Это по существу цикл в одной строке, который вырабатывает длину каждого слова. Мы корнем эти длины непосредственно sum:

sum(len(word) for word in wordslist)

Улучшенная версия

Эта версия использует enumerate, поэтому вы сохраняете две строки кода, сохраняя удобочитаемость:

with open('my_words.txt') as infile:
    words = 0
    characters = 0
    for lineno, line in enumerate(infile, 1):
        wordslist = line.split()
        words += len(wordslist)
        characters += sum(len(word) for word in wordslist)

print(lineno)
print(words)
print(characters)

Эта строка:

with open('my_words.txt') as infile:

открывает файл с обещанием закрыть его, как только вы покинете отступ. Всегда хорошая практика закрывать файл после того, как вы его используете.

Ответ 2

Помните, что каждая строка (кроме последней) имеет разделитель строк. То есть "\ r\n" для Windows или "\n" для Linux и Mac.

Таким образом, ровно два символа добавляются в этом случае как 47, а не 45.

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

import os

fname=input("enter the name of the file:")
infile=open(fname, 'r')
lines=0
words=0
characters=0
for line in infile:
    line = line.strip(os.linesep)
    wordslist=line.split()
    lines=lines+1
    words=words+len(wordslist)
    characters=characters+ len(line)
print(lines)
print(words)
print(characters)

Ответ 3

Чтобы подсчитать символы, вы должны считать каждое отдельное слово. Таким образом, у вас может быть другой цикл, который учитывает символы:

for word in wordslist:
    characters += len(word)

Это должно быть сделано. Список слов должен, вероятно, отображать символы новой строки справа, возможно, что-то вроде wordslist = line.rstrip().split().

Ответ 4

Я нашел это решение очень простым и удобочитаемым:

with open("filename", 'r') as file:
    text = file.read().strip().split()
    len_chars = sum(len(word) for word in text)
    print(len_chars)

Ответ 5

Это слишком долго для комментария.

Python 2 или 3? Потому что это действительно важно. В своем REPL выполните следующие действия:

Python 2.7.12
>>>len("taña")
5

Python 3.5.2
>>>len("taña")
4

А? Ответ лежит в Юникоде. Это ñ является "n" с сочетанием диакритики. Значение его 1 символа, но не 1 байт. Поэтому, если вы не работаете с простым текстом ASCII, лучше указать, для какой версии python предназначена функция подсчета символов.

Ответ 6

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

import re

DATA="""
hey how are you
I am fine and you
Yes I am fine
"""

def get_char_count(s):
    return len(re.findall(r'\S', s))

if __name__ == '__main__':
    print(get_char_count(DATA))

Выход

35

На приведенном ниже рисунке показано, как это протестировано в RegExr:

Regex Test

Ответ 7

Это, вероятно, подсчет новых символов строки. Вычитайте символы с помощью (строк + 1)

Ответ 8

Вот код:

fp = open(fname, 'r+').read()
chars = fp.decode('utf8')
print len(chars)

Проверьте вывод. Я просто протестировал его.

Ответ 9

Более питоновское решение, чем другие:

with open('foo.txt') as f:
  text = f.read().splitlines() # list of lines

lines = len(text) # length of the list = number of lines
words = sum(len(line.split()) for line in text) # split each line on spaces, sum up the lengths of the lists of words
characters = sum(len(line) for line in text) # sum up the length of each line

print(lines)
print(words)
print(characters)

Другие ответы здесь делают вручную, что делает str.splitlines(). Нет причин изобретать велосипед.

Ответ 10

У вас есть правильный ответ - и ваш код полностью верен. То, что я думаю, это то, что проходит конец символа линии, который включает в себя ваш счетчик символов на два (в последней строке нет ни одной новой строки). Если вы хотите удалить это, простая выдумка будет заключаться в том, чтобы предлагать Loaf

characters = characters - (lines - 1)

См. ответ csl для второй части...

Ответ 11

У вас две проблемы. Один - это окончания строки, а другой - промежутки между ними.

Теперь есть много людей, которые опубликовали довольно хорошие ответы, но я считаю, что этот метод легче понять:

characters = characters + len(line.strip()) - line.strip().count(' ')

line.strip() удаляет конечные и ведущие пробелы. Затем я вычитаю количество пробелов из общей длины.

Ответ 12

Просто пропустите нежелательные символы при вызове len,

import os
characters=characters+ len([c for c in line if c not in (os.linesep, ' ')])

или sum счетчик,

characters=characters+ sum(1 for c in line if c not in (os.linesep, ' '))

или постройте a str из wordlist и возьмите len,

characters=characters+ len(''.join(wordlist))

или sum символы в wordlist. Я думаю, что это самый быстрый.

characters=characters+ sum(1 for word in wordlist for char in word)

Ответ 13

Это очень просто:

f = open('file.txt', 'rb')
f.seek(0) # Move to the start of file
print len(f.read()) 

Ответ 14

Здесь я получил самую маленькую программу с меньшим использованием памяти для вашей проблемы

with open('FileName.txt') as f:
  lines = f.readlines()
  data = ''.join(lines)
  print('lines =',len(lines))
  print('Words = ',len(data.split()))
  data = ''.join(data.split())
  print('characters = ',len(data))

Строки будут списком строк, поэтому длина строк - это не что иное, как количество строк. Следующие данные шага содержат строку содержимого вашего файла (каждое слово отделено пробелом), поэтому, если мы разделим данные, вы получите список слов в вашем файле. таким образом, длина этого списка дает количество слов. снова, если мы присоединимся к списку слов, вы получите все символы в виде одной строки. таким образом длина этого дает количество символов.

Ответ 15

взять входные данные в качестве имени файла, т.е. files.txt из входного параметра, а затем подсчитать общее количество символов в файле и сохранить в переменную char

fname = input("Enter the name of the file:")
infile = open(fname, 'r')                   # connection of the file
lines = 0
words = 0
char = 0                                    # init as zero integer
for line in infile:
    wordslist = line.split()                # splitting line to word
    lines = lines + 1                       # counter up the word
    words = words + len(wordslist)          # splitting word to charac
    char = char + len(line)                 # counter up the character

print("lines are: " + str(lines))
print("words are: " + str(words))
print("chars are: " + str(char))            # printing beautify

Ответ 16

num_lines = sum(1 for line in open('filename.txt'))
num_words = sum(1 for word in open('filename.txt').read().split())
num_chars = sum(len(word) for word in open('filename.txt').read().split())