Frage Wie können alle Vorkommen bestimmter Zeichen ersetzt werden?


Ich lese ein CSV in 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

Ich möchte alle Vorkommen von ersetzen ['a','b','c','d'] im 8. Element der Zeile mit leerer Zeichenfolge. das remove_chars Funktion funktioniert nicht.

Gibt es einen besseren Weg, dies zu tun?


35
2017-08-27 21:50


Ursprung


Antworten:


Das Problem ist, dass Sie nichts mit dem Ergebnis tun replace. In Python sind Strings unveränderlich, so dass alles, was eine Zeichenkette manipuliert, eine neue Zeichenkette zurückgibt, anstatt die ursprüngliche Zeichenkette zu modifizieren.

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

59
2017-08-27 21:55



Ich würde die Übersetzungsmethode ohne Übersetzungstabelle verwenden. Es löscht die Buchstaben im zweiten Argument in neueren Python-Versionen.

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
2017-08-27 22:03



Sie sollten wirklich mehrere Eingaben haben, z.B. eine für Vorname, zweite Vornamen, Nachname und eine andere für Alter. Wenn Sie etwas Spaß haben möchten, können Sie versuchen:

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

Dies würde natürlich fehlschlagen, wenn mehrere Zahlen in der Eingabe sind. eine schnelle Überprüfung wäre:

assert(age in input_given)

und auch:

assert(len(name)<len(input_given))

0
2017-10-19 04:02