txt - frecuencia python
Encuentra el nĂºmero de caracteres en un archivo usando Python (14)
Aquí está la pregunta:
Tengo un archivo con estas palabras:
hey how are you
I am fine and you
Yes I am fine
Y se le pide que encuentre el número de palabras, líneas y caracteres.
A continuación se encuentra mi programa, pero el número de conteos para los caracteres sin espacio no es correcto.
El número de palabras es correcto y el número de línea es correcto. ¿Cuál es el error en el mismo bucle?
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 salida es:
lines=3(Correct)
words=13(correct)
characters=47
He mirado en el sitio con múltiples respuestas y estoy confundido porque no aprendí algunas otras funciones en Python. ¿Cómo corrijo el código tan simple y básico como en el bucle que he hecho?
Mientras que el número de caracteres sin espacio es de 35 y el espacio es de 45. Si es posible, quiero encontrar el número de caracteres sin espacio. Incluso si alguien sabe el bucle para el número de caracteres con espacio que está bien.
¿Cómo es esto? Utiliza una expresión regular para hacer coincidir todos los caracteres que no son espacios en blanco y devuelve el número de coincidencias dentro de una cadena.
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))
Salida
35
La imagen de abajo muestra esto probado en RegExr:
Aquí está el código:
fp = open(fname, ''r+'').read()
chars = fp.decode(''utf8'')
print len(chars)
Compruebe la salida. Acabo de probarlo.
Aquí tengo el programa más pequeño con menos uso de memoria para su problema
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))
las líneas serán una lista de líneas, por lo que la longitud de las líneas no es más que una cantidad de líneas. Los siguientes datos de pasos contienen una cadena del contenido de su archivo (cada palabra separada por un espacio en blanco), por lo tanto, si dividimos los datos, obtendremos una lista de palabras en su archivo. así, la longitud de esa lista da el número de palabras. de nuevo, si nos unimos a la lista de palabras, obtendrá todos los caracteres como una sola cadena. por lo tanto la longitud de eso da número de caracteres.
Encontré esta solución muy simple y legible:
with open("filename", ''r'') as file:
text = file.read().strip().split()
len_chars = sum(len(word) for word in text)
print(len_chars)
Es muy sencillo:
f = open(''file.txt'', ''rb'')
f.seek(0) # Move to the start of file
print len(f.read())
Esto es demasiado largo para un comentario.
Python 2 o 3? Porque realmente importa . Pruebe lo siguiente en su REPL para ambos:
Python 2.7.12
>>>len("taña")
5
Python 3.5.2
>>>len("taña")
4
Eh La respuesta está en Unicode. Eso es una ''n'' con una combinación diacrítica. Significando su carácter de 1, pero no 1 byte. Por lo tanto, a menos que esté trabajando con texto ASCII simple, es mejor que especifique para qué versión de python está destinada su función de conteo de caracteres.
Para contar los caracteres, debes contar cada palabra individual. Así que podrías tener otro bucle que cuente personajes:
for word in wordslist:
characters += len(word)
Eso debería hacerlo. La lista de palabras probablemente debería quitar los caracteres de nueva línea a la derecha, algo así como la lista de wordslist = line.rstrip().split()
quizás.
Probablemente es contar nuevos caracteres de línea. Restar caracteres con (líneas + 1)
Recuerde que cada línea (excepto la última) tiene un separador de línea. Es decir "/ r / n" para Windows o "/ n" para Linux y Mac.
Por lo tanto, exactamente dos caracteres se agregan en este caso, como 47 y no 45.
Una buena manera de superar esto podría ser usar:
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)
Simplemente omite los caracteres no deseados al llamar a len
,
import os
characters=characters+ len([c for c in line if c not in (os.linesep, '' '')])
o sum
la cuenta,
characters=characters+ sum(1 for c in line if c not in (os.linesep, '' ''))
o construir una str
de la wordlist
y tomar len
,
characters=characters+ len(''''.join(wordlist))
o sum
los caracteres en la wordlist
. Creo que este es el más rápido.
characters=characters+ sum(1 for word in wordlist for char in word)
Suma la longitud de todas las palabras en una línea:
characters += sum(len(word) for word in wordslist)
Todo el programa:
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)
Salida:
3
13
35
Esta:
(len(word) for word in wordslist)
Es una expresión generadora . Es esencialmente un bucle en una línea que produce la longitud de cada palabra. Alimentamos estas longitudes directamente a la sum
:
sum(len(word) for word in wordslist)
Versión mejorada
Esta versión aprovecha la enumerate
, por lo que guarda dos líneas de código, manteniendo la legibilidad:
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)
Esta línea:
with open(''my_words.txt'') as infile:
abre el archivo con la promesa de cerrarlo tan pronto como salga de la sangría. Siempre es una buena práctica cerrar el archivo una vez que haya terminado de usarlo.
Tiene la respuesta correcta y su código es completamente correcto. Lo que creo que está haciendo es que hay un carácter de final de línea que se pasa, que incluye el número de caracteres en dos (no hay uno en la última línea, ya que no hay una nueva línea a la que ir). Si desea eliminar esto, el simple fudge sería hacer lo que le sugiere Loaf
characters = characters - (lines - 1)
Vea la respuesta de csl para la segunda parte ...
Tienes dos problemas. Uno es el final de la línea y el otro es los espacios intermedios.
Ahora hay muchas personas que publicaron respuestas bastante buenas, pero este método me resulta más fácil de entender:
characters = characters + len(line.strip()) - line.strip().count('' '')
line.strip () elimina los espacios finales y anteriores. Luego estoy restando el número de espacios de la longitud total.
Una solución más pitónica que las demás:
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)
Las otras respuestas aquí están haciendo manualmente lo que hace str.splitlines()
. No hay razón para reinventar la rueda.