从一个文件追加/替换来自另一个文件的信息

时间:2014-09-04 02:41:32

标签: python replace append text-files

我的Python技能很生疏,我看过StackOverflow和在线,但我想做的比大多数都复杂,不包括第三个文件。

基本上,我有两个文件,其中有一些相同的字段(标题)和常见但不相同(链接)。我想从一个文件中的链接中获取ISBN(唯一编号),并将其替换/替换在另一个文件的链接字段中。起初我尝试检查标题然后更新该链接字段,但这似乎太复杂了。每个标题都有一个链接字段和一个ISBN。

这个当前代码从第一个文件中获取ISBN,我只是坚持如何将它附加到另一个文件中的链接字段。谢谢!

#This code compares two .txt files, matches on titles, and copies ISBN into the link
title = "title: "
link = "856"
isbn = ""
with open("test-original.txt", "r") as file, open("test-change.txt", "a") as change:
    for line in file:
        if link in line:
            isbn = line.strip("856 http://www.example.com/")
            print change.write(line.replace("com/", "com/" + isbn))
    #for line in change:
        #if title in line:
            #print line.strip("title: ")

1 个答案:

答案 0 :(得分:0)

这里至少有两件事可以指。你说你想"追加/替换"从第一个文件到第二个文件的修改行。

如果您的意思是"追加",您已经做到了这一点。

如果您的意思是"替换",那么您必须解释您尝试更换的内容。为简单起见,我将假设线条处于锁定步骤:test-original的第20行与test-change的第20行匹配,因此它的第20行你想要替换的test-change。 (如果"对应的行"你要替换的东西是不同的,那么你可能必须将文件读入内存,搜索它,使用linecache等;而不知道究竟是什么打算通过"对应",我不知道怎么写它......)

此外,您无法就地替换文本文件中的行。文本文件只是一个字符流;如果你用80个字符的行覆盖一个60个字符的行,你只是覆盖了下一行的前20个字符。

所以,你要做的是写一个 new 文件 - 通常,你写一个临时文件,然后在你完成后将它移到原始文件之上。所以:

with tempfile.NamedTemporary("w", dir=".", delete=False) as tmp:
    with open("test-original.txt", "r") as file, open("test-change.txt", "r") as change:
        for origline, changeline in zip(file, change):
            if link in origline:
                isbn = origline.strip("856 http://www.example.com/")
                tmp.write(origline.replace("com/", "com/" + isbn))
            else:
                tmp.write(changeline)
os.replace(tmp.name, "test-change.txt")

请注意os.replace需要Python 3.3,而您的代码看起来像Python 2.x.不幸的是,以安全和原子的方式替换文件甚至在Windows上工作是非常痛苦的(这正是添加os.replace的原因)。如果您不担心原子性,而不是os.replace,请执行以下操作:

os.remove("test-change.txt")
os.rename(tmp.name, "test-change.txt")