简体   繁体   中英

Replace column based strings with multiple with pre-defined values - Python

I am bit confused with approach to implement the below logic in python. I would need expert advice in choosing a method.

I have to replace strings with predefined values in certain columns. For eg

| is delimiter

Input :

ABCD|NewYork|800|TU
XYA|England|589|IA

Output :

QWER|NewYork|800|PL
NHQ|England|589|DQ

Predefined dictionary :

Actual Value  : ABCDEFGHIJKLMNOPQRSTUVWXYZ
Replace Value : QWERTYASDFGHNBVCXZOPLKMNHY

So, If value is ABCD, I should get QWER. If it is TU then it should replace it with PL. The values can be random.

My approach would be like below

  1. Read a line and then go to column 1
  2. read each character and replace one by one by using replace values
  3. Go to column 4 and then read each character and replace one by one
  4. go to next line and so on....

I feel this might be poor way of coding. Is there any different way than above approach? Please suggest a method.

Column's may be different for different files. It should be dynmaic

You can make use of str.translate and str.maketrans to make your life a lot easier here:

In [1]: fnd = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   ...: rpl = 'QWERTYASDFGHNBVCXZOPLKMNHY'
   ...: trns = str.maketrans(fnd, rpl)

In [2]: 'ABCD'.translate(trns)
Out[2]: 'QWER'

In [4]: 'UV'.translate(trns)
Out[4]: 'LK'

This is one way using a list comprehensions with str.join .

The trick is to convert your dictionary to a Python dict .

x = ['ABCD|NewYork|800|TU',
     'XYA|England|589|IA']

d = dict(zip('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
             'QWERTYASDFGHNBVCXZOPLKMNHY'))

res = ['|'.join([''.join(list(map(d.get, i[0])))]+i[1:]) \
       for i in map(lambda y: y.split('|'), x)]

Result:

['QWER|NewYork|800|TU',
 'NHQ|England|589|IA']

This should do it:

from string import maketrans

actual = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

replace = 'QWERTYASDFGHNBVCXZOPLKMNHY'

with open('infile.txt') as inf, open('outfile.txt', 'w') as outf:
    toBeWritten = []
    for line in inf:
        items = line.strip().split('|')
        items[0] = items[0].translate(maketrans( actual, replace))
        items[3] = items[3].translate(maketrans( actual, replace))
        print items
        toBeWritten.append('|'.join(items))
    outf.writelines(toBeWritten)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM