2010-08-27 9 views
29

estoy leyendo un CSV en a:¿cómo se reemplazan todas las apariciones de ciertos caracteres?

import csv 
import collections 
import pdb 
import math 
import urllib 

def do_work(): 
    a=get_file('c:/pythonwork/cds/cds.csv') 
    a=remove_chars(a) 
    print a[0:10] 

def get_file(start_file): #opens original file, reads it to array 
    with open(start_file,'rb') as f: 
    data=list(csv.reader(f)) 
    return (data) 

def remove_chars(a): 
    badchars=['a','b','c','d'] 
    for row in a: 
    for letter in badchars: 
     row[8].replace(letter,'') 
    return a 

me gustaría reemplazar todas las apariciones de ['a','b','c','d'] en el elemento 8 de la línea con una cadena vacía. la función remove_chars no funciona.

¿Hay una mejor manera de hacerlo?

+0

octavo elemento es la línea [7], debido a la indexación comienza desde 0. –

Respuesta

49

El problema es que no está haciendo nada con el resultado de replace. En Python, las cadenas son inmutables, de modo que cualquier cosa que manipule una cadena devuelve una nueva cadena en lugar de modificar la cadena original.

line[8] = line[8].replace(letter, "") 
1

Utilizaría el método de traducción sin tabla de traducción. Elimina las letras en el segundo argumento en las versiones recientes de Python.

def remove_chars(line): 
    line7=line[7].translate(None,'abcd') 
    return line[:7]+[line7]+line[8:] 

line= ['ad','da','sdf','asd', 
     '3424','342sfas','asdfaf','sdfa', 
     'afase'] 
print line[7] 
line = remove_chars(line) 
print line[7] 
+0

función tan simple como 'remove_chars' no debería, en general, de forma destructiva modificar valor de una variable global. – OTZ

+0

Hice que la función devuelva la línea modificada. –

+0

Gracias - más eficiente, pero para su información, como se señala en https://stackoverflow.com/questions/11692199/string-translate-with-unicode-data-in-python, el método 'translate' funciona de manera diferente con las cadenas Unicode. Entonces, si está haciendo solo un carácter, 'replace', que funciona igual para ambas cadenas y unicode, probablemente sea preferible. – nealmcb

1

Realmente debería tener varias entradas, p. uno para firstname, middle names, lastname y otro para age. Si quiere divertirse, intente:

>>> input_given="join smith 25" 
>>> chars="".join([i for i in input_given if not i.isdigit()]) 
>>> age=input_given.translate(None,chars) 
>>> age 
'25' 
>>> name=input_given.replace(age,"").strip() 
>>> name 
'join smith' 

Esto, por supuesto, fallará si hay varios números en la entrada. una comprobación rápida sería:

assert(age in input_given) 

y también:

assert(len(name)<len(input_given)) 
Cuestiones relacionadas