使用python替换文本文件中的特定行

时间:2015-08-01 00:45:56

标签: python-2.7 replace

首先,我是python的新手,所以请耐心等待。我试图从一个文件中读取,检索特定值并用类似格式覆盖另一个文件中的旧值。两个文件中的格式为“text value = xxx”。我让程序的前半部分工作,我可以提取我想要的值并将它们放入名为'params {}'的dict中。我没想到的部分是如何将特定值写入目标文件而不显示在文件末尾或只是写垃圾或只写文件的一半。这是我到目前为止的源代码:

import os, os.path, re, fileinput, sys

#set the path to the resource files
#res_files_path = r'C:\Users\n518013\Documents\203-104 WA My MRT Files\CIA Data\pelzer_settings'
tst_res_files_path = r'C:\resource'
# Set path to target files.
#tar_files_path = r'C:\Users\n518013\Documents\203-104 WA My MRT Files\CIA Data\CIA3 Settings-G4'
tst_tar_files_path = r'C:\target'
#test dir.
test_files_path = r'C:\Users\n518013\Documents\MRT Equipment - BY 740-104 WA\CIA - AS\Setting Files\305_70R_22_5 setting files\CIA 1 Standard'

# function1 to find word index and point to value
def f_index(lst, item):
    ind = lst.index(item)
    val = lst[ind + 3]
    print val
    return val

# function 2 for values only 1 away from search term
def f_index_1(lst, item):
    ind = lst.index(item)
    val = lst[ind + 1]
    return val


# Create file list.
file_lst = os.listdir(tst_res_files_path)

# Traverse the file list and read in dim settings files.
# Set up dict.
params = {}
#print params
for fname in file_lst:
    file_loc = os.path.join(tst_res_files_path, fname)
    with open(file_loc, 'r') as f:
        if re.search('ms\.', fname):
            print fname
            break
        line = f.read()
        word = re.split('\W+', line)
        print word
        for w in word:
            if w == 'Number':
                print w
                params['sectors'] = f_index(word, w)
            elif w == 'Lid':
                params['lid_dly'] = f_index(word, w)
            elif w == 'Head':
                params['rotation_dly'] = f_index(word, w)
            elif w == 'Horizontal':
                tmp = f_index_1(word, w)
                param = int(tmp) + 72 
                params['horizontal'] = str(param)
            elif w == 'Vertical':
                tmp = f_index_1(word, w)
                param = int(tmp) - 65
                params['vertical'] = str(param)
            elif w == 'Tilt':
                params['tilt'] = f_index_1(word, w)
            else:
                print 'next...'

        print params #this is just for debugging
        file_tar = os.path.join(tst_tar_files_path, fname)



        for lines in fileinput.input(file_tar, inplace=True):
            print lines.rstrip()
            if lines.startswith('Number'):
                if lines[-2:-1] != params['sectors']:
                    repl = params['sectors']

                    lines = lines.replace(lines[-2:-1], repl)
                    sys.stdout.write(lines)

            else:
                continue

示例文本文件:

[ADMINISTRATIVE SETTINGS]
SettingsType=SingleScan
DimensionCode=
Operator=
Description=rev.1 4sept03
TireDimClass=Crown
TireWidth=400mm
[TEST PARAMETERS]
Number Of Sectors=9
Vacuum=50
[DELAY SETTINGS]
Lid Close Delay=3
Head Rotation Delay=3
[HEAD POSITION]
Horizontal=140
Vertical=460
Tilt=0
[CALIBRATION]
UseConvFactors=0
LengthUnit=0
ConvMMX=1
ConvPixelX=1
CorrFactorX=1
ConvMMY=1
ConvPixelY=1
CorrFactorY=1

结束样本txt。

我只回写了一半文件的代码,我不明白为什么?我试图将'扇区数= 9'替换为'扇区数= 8',如果我可以使其工作,其余的替换可以使用if语句完成。

请帮忙!我花了几个小时在谷歌寻找答案和信息,我发现的一切让我接近但没有雪茄!

提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

您的文件包含' .ini'格式。 python支持使用ConfigParser模块读取和写入。你可以这样做:

# py3: from pathlib import Path
import os.path
import configparser

# py3: IN_PATH = Path(__file__).parent / '../data/sample.ini'
# py3: OUT_PATH = Path(__file__).parent / '../data/sample_out.ini'
HERE = os.path.dirname(__file__)
IN_PATH = os.path.join(HERE, '../data/sample.ini')
OUT_PATH = os.path.join(HERE, '../data/sample_out.ini')

config = configparser.ConfigParser()
# py3: config.read(str(IN_PATH))
config.read(IN_PATH)
print(config['CALIBRATION']['LengthUnit'])
config['CALIBRATION']['LengthUnit'] = '27'

# py3: with OUT_PATH.open('w') as fle:
with open(OUT_PATH, 'w') as fle:
    config.write(fle)