在python中更改文本文件中特定位置的值

时间:2015-10-12 21:00:46

标签: python

python中是否有库/命令来更改文本文件中特定位置的值?

E.g。假设我有一个名为test.txt的文件,其中包含以下数据:

abc 123.2  45 text_data
ghk 12.43  123.45  89.3

关键是这个文本文件不能被读作结构化数据,例如通过使用pandas或假设存在常规列。

所以,我有一个单独的文件,我指定需要更改为新值的行和列。

row column_start  column_end new_value
2    5             9            10.4

第二行中的12.43应替换为test.txt中的10.4

2 个答案:

答案 0 :(得分:2)

获得该行后,提取行,开始,结束和val,然后您可以使用fileinput.input更改原始文件:

from fileinput import input
from sys import stdout

line = "2    5             9            10.4"

r, st, ed, val = line.split()
r, st, ed = int(r), int(st), int(ed)
for ind, line in enumerate(input("test.txt",inplace=True), 1):
    if ind == r:
        stdout.write(line.replace(line[st-1:ed], val))
    else:
        stdout.write(line)

这可能不仅仅取代您想要的值,因此切片可能是最安全的方法:

for ind, line in enumerate(input("test.txt", inplace=True), 1):
    if ind == r:
        new = line[:st-1] + val + line[ed:]
        stdout.write(new)
    else:
        stdout.write(line)

如果要更改多行,请使用dict创建映射:

from fileinput import input
from sys import stdout

with open("changes.txt") as f:
    next(f)
    data = {int(r): {"st": int(st), "ed": int(ed), "val": val} for r, st, ed, val in map(str.split, f)}
    for ind, line in enumerate(input("test.txt"), 1):
        if ind in data:
            d = data[ind]
            new = line[:d["st"] - 1] + d["val"] + line[d["ed"]:]
            stdout.write(new)
        else:
            stdout.write(line)

答案 1 :(得分:1)

怎么样

import sys
# load the values from the instruction file however you want (a separate problem)
row=2
column_start=5
column_end=9
new_value=10.4

# process the data
for line_num, contents in enumerate(open("test.txt")):
    if line_num == row - 1:
        contents = contents[:column_start-1] + str(new_value) + contents[column_end:]
    # write the results somewhere
    sys.stdout.write(contents)