从一个文件中附加/替换另一个文件的信息字符串
我的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 个回答
这里至少有两种可能的意思。你说你想把第一个文件中修改过的行“追加/替换”到第二个文件里。
如果你是指“追加”,那么你现在做的就是这个。
如果你是指“替换”,那么你需要解释一下你想替换什么。我假设为了简单起见,这两行是按顺序对应的: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")