user42459
user42459

Reputation: 915

Replacing cell, not string

I have the following code.

import fileinput

map_dict = {'*':'999999999', '**':'999999999'}
for line in fileinput.FileInput("test.txt",inplace=1):
    for old, new in map_dict.iteritems():
        line = line.replace(old, new)
    sys.stdout.write(line)

I have a txt file

1\tab*
*1\tab**

Then running the python code generates

1\tab999999999
9999999991\tab999999999

However, I want to replace "cell" (sorry if this is not standard terminology in python. I am using the terminology of Excel) not string.

The second cell is

*

So I want to replace it.

The third cell is

1*

This is not *. So I don't want to replace it.

My desired output is

1\tab999999999
*1\tab999999999

How should I make this? The user will tell this program which delimiter I am using. But the program should replace only the cell not string..

And also, how to have a separate output txt rather than overwriting the input?

Upvotes: 0

Views: 67

Answers (2)

Sci Prog
Sci Prog

Reputation: 2691

  1. Open a file for writing, and write to it.
  2. Since you want to replace the exact complete values (for example not touch 1*), do not use replace. However, to analyze each value split your lines according to the tab character ('\t').
  3. You must also remove end of line characters (as they may prevent matching last cells in a row).

Which gives

import fileinput
MAPS = (('*','999999999'),('**','999999999'))
with open('output.txt','w') as out_file:
  for line in open("test.txt",'r'):
    out_list = []
    for inp_cell in line.rstrip('\n').split('\t'):
      out_cell = inp_cell
      for old, new in MAPS:
        if out_cell == old:
          out_cell = new
      out_list.append(out_cell)
    out_file.write( "\t".join(out_list) + "\n" )

There are more condensed/compact/optimized ways to do it, but I detailed each step on purpose, so that you may adapt to your needs (I was not sure this is exactly what you ask for).

Upvotes: 1

Mark Tolonen
Mark Tolonen

Reputation: 177951

the csv module can help:

#!python3
import csv
map_dict = {'*':'999999999','**':'999999999'}
with open('test.txt',newline='') as inf, open('test2.txt','w',newline='') as outf:
    w = csv.writer(outf,delimiter='\t')
    for line in csv.reader(inf,delimiter='\t'):
        line = [map_dict[item] if item in map_dict else item for item in line]
        w.writerow(line)

Notes:

  1. with will automatically close files.
  2. csv.reader parses and splits lines on a delimiter.
  3. A list comprehension translates line items in the dictionary into a new line.
  4. csv.writer writes the line back out.

Upvotes: 0

Related Questions