2012-01-15 16 views
6

Tengo una base de datos:Separar una cadena de longitud variable en varias partes de pitón

Como se puede ver en la columna 'desc', el texto es de longitud variable (es decir, no hay dos cadenas I extracción de esta base de datos van a ser de la misma longitud). Eventualmente añadiré muchas más entradas a esta base de datos, pero esto es con lo que estoy probando y comenzando por el momento.

En este momento, tengo el siguiente código Python para agarrar estos bloques de cuerda y mostrarlos:

cmd = input(Enter command:) 
sql = "SELECT cmd,`desc` FROM table WHERE cmd = '"+ cmd +"'" 
cursor.execute(sql) 
result = cursor.fetchall() 
for row in result: 
    print("Command: "+ row[0] +":\n") 
    print("Description: "+ row[1][:40] +"\n") 
    if (len(row[1]) > 40): 
     print(row[1][40:85]) 
    if (len(row[1]) > 85): 
     print(row[1][85:130]) 
    if (len(row[1]) > 130): 
     print(row[1][130:165]) 
    if (len(row[1]) > 165): 
     print(row[1][165:]) 

El desdoblamiento aquí funciona hasta cierto punto, por ejemplo:

Comando: cerrar :
Descripción: Este comando creará un 'close' butto
n en la ventana de mensajes para invocar el carácter
acter. Si actualmente no hay una ventana en la pantalla, t
La ejecución del script finalizará.

Como puede ver en el ejemplo anterior de la salida, la división hace que algunos caracteres se corten en la mitad de la palabra. Dado el hecho de que las cadenas podrían ser de cualquier longitud entre digamos ... 20 caracteres en total y hasta 190ish, y quiero dividir la cadena en pedazos de, digamos ... 8 palabras cada uno debido a limitaciones de espacio, ¿cómo podría ir? sobre hacer esto?

+0

utilice la sustitución de parámetros en lugar de construir manualmente cadena sql, por ejemplo, 'cursor.execute ('select * from commands where cmd =?', (Cmd,))'. No necesita llamar 'cursor.fetchall()' podría iterar sobre él directamente: 'para la fila en el cursor: ...' – jfs

Respuesta

2

Dividir en espacios para separar palabras, luego unir 8 a la vez con un espacio como separador.

content = "This is some sentence that has more than eight words" 
content = content.split(" ") 
print content 
['This', 'is', 'some', 'sentence', 'that', 'has', 'more', 'than', 'eight', 'words'] 
print(" ".join(content[0:8])) 
This is some sentence that has more than 
+0

¡Gracias! Esto era lo que estaba buscando, por ahora. – Jguy

1

Corte por palabras en lugar de caracteres usando Python textwrap módulo:

>>> import textwrap 
>>> text = 'asdd sdfdf asdsg asfgfhj' 
>>> s = textwrap.wrap(text, width=10) # <- example 10 characters 
>>> s 
['asdd sdfdf', 'asdsg', 'asfgfhj'] 
>>> print '\n'.join(s) 
asdd sdfdf 
asdsg 
asfgfhj 
>>> 
16

Mira la textwrap module.

>>> import textwrap 
>>> 
>>> s = "This command will create a 'close' button in the message window for the invoking character. If no window is currently on screen, the script execution will end." 
>>> 
>>> wrapped = textwrap.wrap(s, 40) 
>>> 
>>> for line in wrapped: 
...  print line 
... 
This command will create a 'close' 
button in the message window for the 
invoking character. If no window is 
currently on screen, the script 
execution will end. 

Puede hacer una gran cantidad de configuraciones de TextWrapper.

+0

TIL textwrap, muy útil – JustinDanielson

+0

¡¿Esto existe ?! Las bibliotecas estándar de Python nunca dejan de sorprenderme. +1 – senderle

+0

Estaba trabajando en un truco sucio para hacer el trabajo. No tenía idea de que algo como esto estuviera disponible. Definitivamente voy a echar un vistazo una vez que tenga la oportunidad. ¡Gracias! – Jguy

Cuestiones relacionadas