2010-08-27 25 views
29

Ben a içine csv okuyorum:Belirli karakterlerin tüm oluşumlarını nasıl değiştirebilirim?

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 

Ben boş dize ile hattın 8 elemanda ['a','b','c','d'] tüm tekrarlarını değiştirmek istiyorum. remove_chars işlevi çalışmıyor.

Bunu yapmanın daha iyi bir yolu var mı?

+0

8. elemanı hattı [7], indeksleme 0 –

cevap

49

Sorun şu ki, replace sonucuyla hiçbir şey yapmıyorsunuz. Python dizeleri değişmezdir, dolayısıyla bir dizeyi işleyen her şey, orijinal dizgiyi değiştirmek yerine yeni bir dize döndürür.

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

Çeviri tablosunu kullanmadan çeviri yöntemini kullanırım. Son Python sürümlerinde ikinci argümandaki harfleri siler.

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

Fonksiyon başlar, çünkü remove_chars' 'kadar basit yıkıcı değiştirmez genel olarak gereken bir küresel değişkenin değeri. – OTZ

+0

Fonksiyonu döndürdüm, satır değişti. –

+0

Teşekkürler - daha verimli ama FYI, https://stackoverflow.com/questions/11692199/string-translate-with-unicode-data-in-python'da belirtildiği gibi, 'translate' yöntemi, unicode dizeleriyle farklı çalışır. Yani eğer sadece bir karakter yapıyorsanız, hem dizgiler hem de unicode için aynı şekilde çalışan “replace”, muhtemelen tercih edilir. – nealmcb

1

Gerçekten çok sayıda girişe sahip olmalısınız, örn. adınız, adınız, soyadınız ve yaşınız için bir tane daha. Yine de biraz eğlenmek isterseniz deneyin:

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

Bu, eğer girişte birden fazla sayı varsa başarısız olur. Hızlı bir kontrol olacaktır: Ayrıca

assert(age in input_given) 

ve:

assert(len(name)<len(input_given)) 
İlgili konular