76

I am reading a csv into 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

I would like to replace all occurrences of ['a','b','c','d'] in the 8th element of the line with empty string. the remove_chars function is not working.

Is there a better way to do this?

fIwJlxSzApHEZIl
  • 11,861
  • 6
  • 62
  • 71
Alex Gordon
  • 57,446
  • 287
  • 670
  • 1,062

3 Answers3

120

The problem is that you are not doing anything with the result of replace. In Python strings are immutable so anything that manipulates a string returns a new string instead of modifying the original string.

line[8] = line[8].replace(letter, "")
Victor Schröder
  • 6,738
  • 2
  • 42
  • 45
Matti Virkkunen
  • 63,558
  • 9
  • 127
  • 159
1

I would use the translate method without translation table. It deletes the letters in second argument in recent Python versions.

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]
Tony Veijalainen
  • 5,447
  • 23
  • 31
  • Function as simple as `remove_chars` should not in general destructively modify value of a global variable. – OTZ Aug 27 '10 at 22:07
  • I made the function return the line changed. – Tony Veijalainen Aug 27 '10 at 22:59
  • Thanks - more efficient, but FYI, as noted in https://stackoverflow.com/questions/11692199/string-translate-with-unicode-data-in-python the `translate` method works differently with unicode strings. So if you're doing just one character, `replace`, which works the same for both strings and unicode, is probably preferable. – nealmcb Nov 04 '17 at 16:25
0

You really should have multiple input, e.g. one for firstname, middle names, lastname and another one for age. If you want to have some fun though you could try:

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

This would of course fail if there is multiple numbers in the input. a quick check would be:

assert(age in input_given)

and also:

assert(len(name)<len(input_given))
Rusty Rob
  • 16,489
  • 8
  • 100
  • 116