从一个文件中附加/替换另一个文件的信息字符串

2 投票
1 回答
2224 浏览
提问于 2025-04-19 17:46

我的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

这里至少有两种可能的意思。你说你想把第一个文件中修改过的行“追加/替换”到第二个文件里。

如果你是指“追加”,那么你现在做的就是这个。

如果你是指“替换”,那么你需要解释一下你想替换什么。我假设为了简单起见,这两行是按顺序对应的:test-original的第20行和test-change的第20行是对应的,所以你想替换的就是test-change的第20行。(如果你想替换的“对应行”是其他的内容,那你可能需要把文件读入内存,搜索它,使用linecache等等;如果不知道你具体想要的“对应”是什么,我就不知道该怎么写了…)

另外,你不能在文本文件中直接替换一行。文本文件其实就是一串字符流;如果你用一个80个字符的行去覆盖一个60个字符的行,你就会把下一行的前20个字符也覆盖掉。

所以,你想做的应该是写一个新的文件——通常,你会先写一个临时文件,等完成后再把它覆盖到原文件上。所以:

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")

撰写回答