txt - Función de división al escribir un archivo abierto en Python
ejercicios de archivos en python (3)
El .split
método de cadena .split
solo puede funcionar con delimitadores simples. Sin una discusión, simplemente se divide en espacios en blanco . Para un comportamiento de división más complejo, lo más fácil es usar regex:
>>> s = "I like to code, because to code is fun. A computer''s skeleton."
>>> import re
>>> delim = re.compile(r"""/s|([,.;'':"])""")
>>> tokens = filter(None, delim.split(s))
>>> idx = {}
>>> result = []
>>> i = 1
>>> for token in tokens:
... if token in idx:
... result.append(idx[token])
... else:
... result.append(i)
... idx[token] = i
... i += 1
...
>>> result
[1, 2, 3, 4, 5, 6, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 9]
Además, no creo que deba iterar sobre el archivo línea por línea, según sus especificaciones. Deberías hacer algo como:
with open(''my file.txt'') as f:
s = f.read()
Lo cual pondrá todo el archivo como una cadena en s
. Nota: nunca utilicé open
antes de la declaración with
, eso no tiene ningún sentido.
Esta pregunta ya tiene una respuesta aquí:
- Indexar una lista con un índice único 6 respuestas
Así que tengo un programa en el que se supone que debo tomar un archivo externo, abrirlo en Python y luego separar cada palabra y cada puntuación, incluyendo comas, apóstrofes y puntos. Entonces se supone que debo guardar este archivo como las posiciones enteras de cuando aparece cada palabra y puntuación en el texto.
Por ejemplo: - Me gusta codificar, porque codificar es divertido. El esqueleto de una computadora.
En mi programa, tengo que guardar esto como:
1,2,3,4,5,6,3,4,7,8,9,10,11,12,13,14
(Ayuda para aquellos que no entienden) 1-I, 2-like, 3-to, 4-code, 5- (,), 6-because, 7-is, 8-fun 9- (.), 10- A, 11 computadoras, 12- (''), 13-s, 14-esqueleto
Así que esto ha mostrado las posiciones de cada palabra, incluso si se repite, muestra la primera posición que ocurre de la misma palabra
Perdón por la larga explicación, pero esta es mi pregunta real. He hecho esto hasta ahora:
file = open(''newfiles.txt'', ''r'')
with open(''newfiles.txt'',''r'') as file:
for line in file:
for word in line.split():
print(word)
Y aqui esta el resultado:-
They
say
it''s
a
dog''s
life,.....
Desafortunadamente, esta forma de dividir un archivo no separa las palabras de la puntuación y no se imprime horizontalmente. .split no funciona en un archivo, ¿alguien sabe de una manera más efectiva en la que puedo dividir el archivo - palabras de puntuación? Y luego almacenar las palabras separadas y la puntuación juntas en una lista?
Puedes resolver esto usando regex y split. Espero que esto te indique la dirección correcta. ¡Buena suerte!
import re
str1 = ''''''I like to code, because to code is fun. A computer''s skeleton.''''''
#Split your string into a list using regex and a capturing group:
matches = [x.strip() for x in re.split("([a-zA-Z]+)", str1) if x not in ['''','' '']]
print matches
d = {}
i = 1
list_with_positions = []
#now build the dictionary entries:
for match in matches:
if match not in d.keys():
d[match] = i
i+=1
list_with_positions.append(d[match])
print list_with_positions
Aquí está la salida. Observe que hay un período final con un puesto de # 9:
[''I'', ''me gusta'', ''hasta'', ''código'', '','', ''porque'', ''a'', ''código'', ''es'', ''diversión'', ''.'', ''A'', '' computadora '', "''", ''s'', ''esqueleto'', ''.'']
[1,2,3,3,6,6,7,7]
Use regex para capturar las subcadenas relevantes:
import re
my_string = "I like to code, because to code is fun. A computer''s skeleton."
matched = re.findall("(/w+)(['',.]?)", my_string) # Split up relevant pieces of text
Filtra las coincidencias vacías y agrega al resultado:
result = []
for word, punc in matched:
result.append(word)
if punc: # Check if punctuation follows the word
result.append(punc)
Luego escribe el resultado en tu archivo:
with open("file.txt", "w") as f:
f.writelines(result) # Write pieces on separate lines
La expresión regular funciona buscando caracteres alfabéticos, luego verifica si hay signos de puntuación a continuación (opcionalmente).