在python 3.1中编辑单个.text行

时间:2011-02-19 01:20:43

标签: python text python-3.x line text-files

我有一些数据以这种格式存储在.txt文件中:

----------|||||||||||||||||||||||||-----------|||||||||||
1029450386abcdefghijklmnopqrstuvwxy0293847719184756301943
1020414646canBeFollowedBySpaces    3292532113435532419963

不要问......

我有很多这样的行,我需要一种方法来在特定行的末尾添加更多数字。

我已经编写代码来找到我想要的行,但我很难过如何在它的末尾添加11个字符。我环顾四周,这个网站对我遇到的其他一些问题很有帮助,但我似乎无法找到我需要的东西。

重要的是,该行保留其在文件中的位置,并以当前顺序保存其内容。

使用python3.1,你会怎么做:

1020414646canBeFollowedBySpaces    3292532113435532419963

1020414646canBeFollowedBySpaces    329253211343553241996301846372998

4 个答案:

答案 0 :(得分:6)

作为一般原则,没有在文本文件中间“插入”新数据的快捷方式。您需要在新文件中复制整个原始文件,并在途中修改所需的文本行。

例如:

with open("input.txt") as infile:
    with open("output.txt", "w") as outfile:
        for s in infile:
            s = s.rstrip() # remove trailing newline
            if "target" in s:
                s += "0123456789"
            print(s, file=outfile)
os.rename("input.txt", "input.txt.original")
os.rename("output.txt", "input.txt")

答案 1 :(得分:4)

查看fileinput模块,它可以对文件进行“就地”编辑。虽然我认为临时文件仍然涉及内部流程。

import fileinput

for line in fileinput.input('input.txt', inplace=1, backup='.orig'):
    if line.startswith('1020414646canBeFollowedBySpaces'):
        line = line.rstrip() + '01846372998' '\n'
    print(line, end='')

print现在打印到文件而不是控制台。

您可能需要在编辑前备份原始文件。

答案 2 :(得分:2)

target_chain = '1020414646canBeFollowedBySpaces    3292532113435532419963'
to_add = '01846372998'

with open('zaza.txt','rb+') as f:
    ch = f.read()
    x = ch.find(target_chain)
    f.seek(x + len(target_chain),0)
    f.write(to_add)
    f.write(ch[x + len(target_chain):])

在这种方法中,绝对必须以二进制模式'b'打开文件,因为某些原因与Python对行结尾的处理有关(参见Universal Newline,默认启用)< / p>

模式'r +'是允许写作和阅读

在此方法中,文件中target_chain之前的内容保持不变。在target_chain向前移动之后是什么。正如格雷格·休吉尔(Greg Hewgill)所说,没有可能将硬盘上的位移动到中间插入新位。

显然,如果文件非常大,读取 ch 中的所有内容可能会消耗太多内存,然后应该更改算法:逐行读取直到包含target_chain的行,然后在插入之前读取下一行,然后继续执行“读取下一行 - 在当前行上重写”直到文件结束,以便逐步从与添加相关的行中移动内容。 / p>

你明白我的意思......

答案 3 :(得分:0)

逐行将文件复制到另一个文件。当你到达需要额外字符的行时,在写入之前添加它们。