Найти количество символов в файле с помощью 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())