Tengo un archivo txt del que quiero exportar todas las palabras que comienzan con 'F' o 'f' con el uso de la lista de comprensión y comando split().

count = []
with open('data.txt','r') as myfile:
    count = [line for line in myfile.split() if (line[0]=='F' or line[0]=='f')]
print(count)

Y tomo el siguiente error

El objeto '_io.TextIOWrapper' no tiene el atributo 'split'

Por lo tanto, ¿hay alguna otra forma de utilizar la comprensión de la lista y la división del comando para obtener el resultado deseado?

-1
G1I2A 5 oct. 2019 a las 16:09

4 respuestas

La mejor respuesta

Desea dividir las cadenas de línea, no el objeto de archivo (del que lee las cadenas):

with open('data.txt','r') as myfile:
    count = [word
             for line in myfile
             for word in line.split()
             if word.lower().startswith('f')]
print(count)

Los sucesivos bucles for en la lista de comprensión efectivamente aplanan el archivo a una lista de (f-) palabras. Si no estás interesado en las palabras mismas y solo quieres contar, puedes hacer

with open('data.txt','r') as myfile:
    # This works because bool inherits int, and True acts like 1, False like 0
    count = sum(word.lower().startswith('f')
                for line in myfile
                for word in line.split())
print(count)

Finalmente, si desea todos los recuentos, use un Counter:

from collections import Counter

with open('data.txt','r') as myfile:
    count = Counter(word.lower()[0]
                    for line in myfile
                    for word in line.split())
print(count['f'])
2
Ilja Everilä 5 oct. 2019 a las 13:42

Puedes probar esto,

Script Python

count = []
with open('data.txt','r') as myfile:
    # remove len if you only need the words starting with `f`
    count = len([word for word in myfile.read().replace("\n"," ").split(" ") if word.lower()[0] == "f"])
print(count)

Archivo de entrada

Sample line inside a File which is a File
Another line in the file with the word File

Salida

4

Véalo en acción aquí

Puede reemplazar if word.lower()[0] == "f" con if word[0] == "f" or word[0] == "F"

0
CodeIt 5 oct. 2019 a las 13:27

También puede concatenar las líneas de su texto y luego usar split () para iterar sobre las palabras.

lines = []
with open("text.txt", "r") as fin:
    lines = "".join(fin.readlines())
count = [w for w in lines.split() if w[0].lower() == 'f']
0
Liumatt 5 oct. 2019 a las 13:25

Con este archivo de entrada:

friday code floor funk

Y este código:

f_words = []
with open('words.txt') as myfile:
    f_words = [word for word in myfile.read().split(" ") if word[0].lower() == 'f']
print(f_words)

Me sale esta salida:

['friday', 'floor', 'funk']
0
GordonAitchJay 5 oct. 2019 a las 13:18
58248601