我有以下代码。
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而不是覆盖输入?
答案 0 :(得分:1)
1*
),请不要使用替换。但是,要分析每个值,请根据制表符分隔您的行(' \ t')。哪个给出了
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)
注意:
with
会自动关闭文件。csv.reader
解析并拆分分隔符上的行。list comprehension
将字典中的订单项翻译为新行。csv.writer
将该行退回。