替换单元格,而不是字符串

时间:2016-03-13 05:37:30

标签: python

我有以下代码。

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)

我有一个txt文件

1\tab*
*1\tab**

然后运行python代码生成

1\tab999999999
9999999991\tab999999999

但是,我想替换" cell" (对不起,如果这不是python中的标准术语。我使用的是Excel术语)而不是字符串。

第二个单元格是

*

所以我想替换它。

第三个细胞是

1*

这不是*。所以我不想替换它。

我想要的输出是

1\tab999999999
*1\tab999999999

我该怎么做?用户将告诉该程序我正在使用哪个分隔符。但程序应该只替换不是字符串的单元格。

另外,如何使用单独的输出txt而不是覆盖输入?

2 个答案:

答案 0 :(得分:1)

  1. 打开文件进行书写,然后写入。
  2. 由于您要替换确切的完整值(例如,不要触摸1*),请不要使用替换。但是,要分析每个值,请根据制表符分隔您的行(' \ t')。
  3. 您还必须删除行尾字符(因为它们可能会阻止匹配行中的最后一个单元格)。
  4. 哪个给出了

    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" )
    

    有更多精简/紧凑/优化的方法,但我会详细说明每一步,以便您可以适应您的需求(我不确定这正是您所要求的)。

答案 1 :(得分:0)

csv模块可以提供帮助:

#!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)

注意:

  1. with会自动关闭文件。
  2. csv.reader解析并拆分分隔符上的行。
  3. list comprehension将字典中的订单项翻译为新行。
  4. csv.writer将该行退回。