Leer línea en archivo, imprimir línea si contiene cadena

Tengo un código de trabajo que abre un archivo, busca una cadena e imprime la línea si contiene esa cadena. Estoy haciendo esto para poder decidir, manualmente, si la línea debe eliminarse de mi conjunto de datos o no.

Pero sería mucho mejor si puedo decirle al progtwig que lea la parte de la línea que contiene la cadena que está entre dos comas.

El código que tengo ahora (ver más abajo)

with open("dvd.txt") as f: for num, line in enumerate(f, 1): if " arnold " in line: num = str(num) print line + '' + num 

Imprime cada línea como esta:

 77.224998664,2014-10-19,386.5889,the best arnold ***** ,81,dvd-action,Cheese 5gr,online-dvd-king93,0.19976,18,/media/removable/backup/2014-10-19/all_items/cheese-5gr?feedback_page=1.html, ships from: Germany ships to: Worldwide ,2014-07-30,online-dvd-king,93 1 

Me gustaría imprimir esto en su lugar:

 ,the best arnold ***** , 1 

o

 the best arnold ***** 1 

Leí esta pregunta, pero espero evitar usar CSV.

Si por alguna razón es difícil encontrar el texto entre comas o cualquier otro carácter específico, sería útil imprimir las 3 palabras antes y después de la cadena que estoy buscando.

Esto es muy simple de hacer con str.split() . La modificación de su función de la siguiente manera producirá la salida que desea.

 with open("dvd.csv") as f: for num, line in enumerate(f, 1): if " arnold " in line: num = str(num) print line.split(',')[3] + '' + num 

str.split divide una cadena en una lista por el separador especificado. Para acceder a la entrada de la lista que desea, simplemente proporcione el índice apropiado (que en su caso debería ser 3).

Además, puede producir su salida con el método str.format() para hacerlo un poco más agradable:

 print "{} {}".format(line.split(',')[3], num) 

Esto también le permitirá eliminar num = str(num) ya que el método de formato puede manejar múltiples tipos de datos (a diferencia de la concatenación de cadenas que no puede).

Como alternativa, puede utilizar una expresión regular de la siguiente manera:

 with open("dvd.txt") as f: for num, line in enumerate(f, 1): re_arnold = re.search(r',\s*([^,]*?arnold[^,]*?)\s*,', line) if re_arnold: print '{} {}'.format(re_arnold.group(1), num) 

Esto luego extraería toda la entrada (entre comas) independientemente del campo en el que se encuentre.