2010-08-27 2 views
29

Я читаю CSV в a:Как заменить все вхождения определенных символов?

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 

Я хотел бы заменить все вхождения ['a','b','c','d'] в 8-й элемент строки с пустой строкой. Функция remove_chars не работает.

Есть ли лучший способ сделать это?

+0

восьмого элемент линия [7], так как индексация начинается с 0. Функции –

ответ

49

Проблема в том, что вы ничего не делаете с результатом replace. В Python строки неизменяемы, поэтому все, что манипулирует строкой, возвращает новую строку вместо изменения исходной строки.

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

Я бы использовал метод перевода без таблицы перевода. Он удаляет буквы во втором аргументе в последних версиях 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

так просто, как 'remove_chars' не должен вообще деструктивно изменить значение глобальной переменной. – OTZ

+0

Я заставил функцию вернуть строку. –

+0

Спасибо - более эффективный, но FYI, как указано в https://stackoverflow.com/questions/11692199/string-translate-with-unicode-data-in-python, метод 'translate' работает по-разному с строками unicode. Поэтому, если вы делаете только один символ, «replace», который работает одинаково для обеих строк и unicode, вероятно, предпочтительнее. – nealmcb

1

Вы действительно должны иметь несколько входных сигналов, например. один для имени, средних имен, фамилии и другого для возраста. Если вы хотите немного повеселиться, можете попробовать:

>>> 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' 

Это, конечно, сбой, если на входе имеется несколько цифр. быстрая проверка будет:

assert(age in input_given) 

, а также:

assert(len(name)<len(input_given)) 
Смежные вопросы