web-dev-qa-db-fra.com

Trouver le nombre de caractères dans un fichier en utilisant Python

Voici la question:

J'ai un fichier avec ces mots:

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

Et il est demandé de trouver le nombre de mots, de lignes et de caractères.

Voici mon programme, mais le nombre de comptes pour les caractères sans espace n’est pas correct.

Le nombre de mots est correct et le nombre de lignes est correct ..___ Quelle est l'erreur dans la même boucle?

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)

La sortie est:

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

J'ai regardé sur le site avec des réponses multiples et je suis confus parce que je n'ai pas appris d'autres fonctions en Python. Comment corriger le code aussi simple et basique que dans la boucle que j'ai créée?

Tandis que le nombre de caractères sans espace est de 35 et avec espace de 45 . Si possible, je veux trouver le nombre de caractères sans espace. Même si quelqu'un connaît la boucle pour le nombre de caractères avec espace, c'est bien.

19
S.Soopra

Résumer la longueur de tous les mots d'une ligne:

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

Le programme complet:

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)

Sortie:

3
13
35

Ce:

(len(Word) for Word in wordslist)

est une expression générateur . C'est essentiellement une boucle dans une ligne qui produit la longueur de chaque mot. Nous alimentons ces longueurs directement dans sum:

sum(len(Word) for Word in wordslist)

Version améliorée

Cette version tire parti de enumerate , donc vous enregistrez deux lignes de code, tout en conservant la lisibilité:

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)

Cette ligne:

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

ouvre le fichier avec la promesse de le fermer dès que vous quittez l'indentation . C'est toujours une bonne pratique de fermer le fichier après l'avoir utilisé.

19
Mike Müller

N'oubliez pas que chaque ligne (à l'exception de la dernière) a un séparateur de ligne . I.e. "\ r\n" pour Windows ou "\ n" pour Linux et Mac.

Ainsi, exactement deux caractères sont ajoutés dans ce cas, 47 et non 45.

Un bon moyen de surmonter cela pourrait être d'utiliser:

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)
9
Solo

Pour compter les caractères, vous devez compter chaque mot individuellement. Donc, vous pourriez avoir une autre boucle qui compte les caractères:

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

Cela devrait faire l'affaire. La liste de mots devrait probablement supprimer les caractères de nouvelle ligne à droite, quelque chose comme wordslist = line.rstrip().split() peut-être.

8
csl

C'est trop long pour un commentaire.

Python 2 ou 3? Parce que c'est vraiment compte. Essayez ce qui suit dans votre REPL pour les deux:

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

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

Hein? La réponse réside en unicode. Ce ñ est un "n" avec une combinaison diacritique. Signifiant son 1 caractère, mais pas 1 octet. Donc, à moins que vous n'utilisiez du texte brut ASCII, vous feriez mieux de spécifier quelle version de python votre fonction de décompte des caractères est pour.

7
Jared Smith

J'ai trouvé cette solution très simplement et lisible:

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

Comment c'est? Il utilise une expression régulière pour faire correspondre tous les caractères non-blancs et renvoie le nombre de correspondances dans une chaîne.

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 __== '__main__':
    print(get_char_count(DATA))

Sortie

35

L'image ci-dessous montre ceci testé sur RegExr:

 Regex Test

6
Tagc

C'est probablement compter les caractères de nouvelle ligne. Soustraire des caractères avec (lignes + 1)

5
Loaf

Voici le code:

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

Vérifiez la sortie. Je viens de le tester.

5
Rahul Meshram

Une solution plus pythonique que les autres:

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)

Les autres réponses ici font manuellement ce que str.splitlines() fait. Il n'y a aucune raison de réinventer la roue.

4
Mego

Vous avez la bonne réponse - et votre code est tout à fait correct. Ce que je pense que c'est ce qui se passe, c'est qu'un caractère de fin de ligne est passé, ce qui inclut votre nombre de personnages par deux (il n'y en a pas sur la dernière ligne, car il n'y a pas de nouvelle ligne à parcourir). Si vous souhaitez supprimer cela, le fudge simple serait de faire comme le pain suggéré 

characters = characters - (lines - 1)

Voir la réponse de csl pour la deuxième partie ...

3
A. N. Other

Vous avez deux problèmes. L'un est les fins de ligne et l'autre les espaces entre les deux.

Maintenant, il y a beaucoup de gens qui ont posté de très bonnes réponses, mais je trouve cette méthode plus facile à comprendre:

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

line.strip () supprime les espaces de fin et de début. Ensuite, je soustrais le nombre d'espaces de la longueur totale.

3
Jimmar

Ignorez simplement les caractères non désirés lorsque vous appelez len

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

ou sum le compte, 

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

ou créez une str à partir de la wordlist et prenez len

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

ou sum les caractères de la wordlist. Je pense que c'est le plus rapide. 

characters=characters+ sum(1 for Word in wordlist for char in Word)
3
Nizam Mohamed

C'est très simple:

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

Ici, j'ai eu le plus petit programme avec moins d'utilisation de mémoire pour votre problème

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))

les lignes seront une liste de lignes, la longueur des lignes n'est donc que le nombre de lignes.Les données de l'étape suivante contiennent une chaîne du contenu de votre fichier (chaque mot séparé par un espace), donc si nous scindons les données, une liste de mots est ajoutée à votre fichier. ainsi, la longueur de cette liste donne le nombre de mots. encore une fois si nous rejoignons la liste des mots, vous obtiendrez tous les caractères en une seule chaîne. ainsi, la longueur de cela donne le nombre de caractères.

0
manik venkat