Подсчитайте количество символов в каждом слове каждой строки файла

этот код напечатает все количество строк, общее количество слов и общее количество символов в текстовом файле. Он работает нормально и дает ожидаемый результат. Но я хочу подсчитать количество символов в каждой строке и напечатать так: -

Line No. 1 has 58 Characters
Line No. 2 has 24 Characters

Код :-

import string
def fileCount(fname):
    #counting variables
    lineCount = 0
    wordCount = 0
    charCount = 0
    words = []

    #file is opened and assigned a variable
    infile = open(fname, 'r')

    #loop that finds the number of lines in the file
    for line in infile:
        lineCount = lineCount + 1
        word = line.split()
        words = words + word

    #loop that finds the number of words in the file
    for word in words:
        wordCount = wordCount + 1
        #loop that finds the number of characters in the file
        for char in word:
            charCount = charCount + 1
    #returns the variables so they can be called to the main function        
    return(lineCount, wordCount, charCount)

def main():
    fname = input('Enter the name of the file to be used: ')
    lineCount, wordCount, charCount = fileCount(fname)
    print ("There are", lineCount, "lines in the file.")
    print ("There are", charCount, "characters in the file.")
    print ("There are", wordCount, "words in the file.")
main()

As

for line in infile:
    lineCount = lineCount + 1 

подсчитывает все строки, но как взять каждую строку для этой операции? Я использую Python 3.X


person cyberoy    schedule 12.07.2015    source источник
comment
Вы можете использовать функцию len.   -  person Avinash Raj    schedule 12.07.2015
comment
Но len также будет считать пробелы и вкладки. Кроме того, как применить его для каждой строки? Мне нужна еще одна петля.   -  person cyberoy    schedule 12.07.2015
comment
для этого нет необходимости использовать регулярное выражение   -  person Padraic Cunningham    schedule 12.07.2015
comment
В Python есть очень полезная встроенная функция collections.Counter, которая представляет собой специализированный словарь, который подсчитывает входы. Смотрите мой ответ. Более короткий код и более производительный, потому что нет необходимости многократно добавлять в список words   -  person smci    schedule 13.05.2018


Ответы (4)


Сохраните всю информацию в dict, затем получите доступ по ключу.

def fileCount(fname):
    #counting variables
    d = {"lines":0, "words": 0, "lengths":[]}
    #file is opened and assigned a variable
    with open(fname, 'r') as f:
        for line in f:
            # split into words
            spl = line.split()
            # increase count for each line
            d["lines"] += 1
            # add length of split list which will give total words
            d["words"] += len(spl)
            # get the length of each word and sum
            d["lengths"].append(sum(len(word) for word in spl))
    return d

def main():
    fname = input('Enter the name of the file to be used: ')
    data = fileCount(fname)
    print ("There are {lines} lines in the file.".format(**data))
    print ("There are {} characters in the file.".format(sum(data["lengths"])))
    print ("There are {words} words in the file.".format(**data))
    # enumerate over the lengths, outputting char count for each line
    for ind, s in enumerate(data["lengths"], 1):
        print("Line: {} has {} characters.".format(ind, s))
main()

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

person Padraic Cunningham    schedule 12.07.2015
comment
collections.Counter — это специализированный словарь, который подсчитывает введенные данные. - person smci; 13.05.2018

Определите set допустимых символов, которые вы хотите подсчитать, а затем вы можете использовать len для получения большей части данных.
Ниже я выбрал набор символов:

['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', ' -', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , ':', ';', '‹', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', ' F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R' , 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', ' _', '`', 'а', 'б', 'с', 'г', 'е', 'е', 'г', 'ч', 'и', 'к', 'к' , 'л', 'м', 'н', 'о', 'р', 'к', 'р', 'с', 'т', 'у', 'в', 'ш', ' х', 'у', 'г', '{', '|', '}', '~']

#Define desired character set
valid_chars = set([chr(i) for i in range(33,127)])
total_lines = total_words = total_chars = 0
line_details = []

with open ('test.txt', 'r') as f:
    for line in f:
        total_lines += 1
        line_char_count = len([char for char in line if char in valid_chars])
        total_chars += line_char_count
        total_words += len(line.split())
        line_details.append("Line %d has %d characters" % (total_lines, line_char_count))

print ("There are", total_lines, "lines in the file.")
print ("There are", total_chars, "characters in the file.")
print ("There are", total_words, "words in the file.")
for line in line_details:
    print (line)
person Rolf of Saxony    schedule 12.05.2018

Мне была поставлена ​​задача создать программу, которая печатает количество символов в строке.

Как новичок в программировании, я обнаружил, что это очень сложно :(.

Вот что я придумал, а также его ответ -

Вот основная часть вашей программы:

with open ('data_vis_tips.txt', 'r') as inFile:
    with open ('count_chars_per_line.txt', 'w') as outFile:
        chars = 0
            for line in inFile:
                line = line.strip('\n')
                chars = len(line)
                outFile.write(str(len(line))+'\n')

Это можно было бы упростить до этого:

with open ('data_vis_tips.txt', 'r') as inFile:
    for line in inFile:
        line = line.strip()
        num_chars = len(line)
        print(num_chars)

Обратите внимание, что аргумент функции strip() не требуется; он удаляет пробелы по умолчанию, а «\n» — это пробелы.

person Noobtocoding    schedule 12.05.2018

Вот более простая версия, использующая встроенный collections.Counter, который представляет собой специализированный словарь, который учитывает его входы. Мы можем использовать метод Counter.update(), чтобы вводить все слова (уникальные или нет) в каждой строке:

from collections import Counter

def file_count_2(fname):

    line_count = 0
    word_counter = Counter()

    infile = open(fname, 'r')
    for line in infile:
        line_count += 1
        word_counter.update( line.split() )

    word_count = 0
    char_count = 0

    for word, cnt in word_counter.items():
        word_count += cnt
        char_count += cnt * len(word)

    print(word_counter)

    return line_count, word_count, char_count

Примечания:

  • Я проверил это, и он дает идентичные значения для вашего кода.
  • это будет намного быстрее, так как вы не добавляете итеративно к списку words (лучше просто хэшировать только уникальные слова и сохранять их количество, что и делает Counter), а также нет необходимости повторять и увеличивать charCount каждый раз, когда мы видим появление слова.
  • если бы вы хотели только word_count, а не char_count, вы могли бы просто взять word_count = sum(word_counter.values()) без необходимости перебирать word_counter
person smci    schedule 13.05.2018
comment
PS именование word_count, line_count и т. д. более похоже на Pythonic (формат PEP-8), чем wordCount, lineCount; мы используем CamelCase только для имен классов, а не переменных, функций или методов. - person smci; 15.05.2018
comment
Хотя этот ответ, вероятно, более эффективен, чем исходный код, он не отвечает на вопрос, как подсчитать и напечатать количество символов в каждой строке. - person Rolf of Saxony; 16.05.2018
comment
@RolfofSaxony: это действительно так, в соответствии с оригинальным заголовком и примером кода OP. Редактирование заголовка было моим, а не их, чтобы отразить их намерения. Теперь я исправил это, чтобы было понятно каждое слово каждой строки, а не каждое слово каждой строки - person smci; 17.05.2018
comment
из вопроса: Строка №1 имеет 58 символов Строка №2 имеет 24 символа ?? - person Rolf of Saxony; 17.05.2018
comment
@RolfofSaxony: ах, я взял код OP как спецификацию того, что они хотели, и очистил его. Но они хотели расширить его до подсчета в каждой строке. Позвольте мне исправить мой код... - person smci; 17.05.2018
comment
Обратите внимание на комментарии, что пробелы и табуляции должны быть исключены - person Rolf of Saxony; 17.05.2018
comment
@RolfofSaxony: да, я сделал аналогичный комментарий несколько дней назад - person smci; 17.05.2018