我有两个txt文件(file_srs.txt和file_rm.txt)
这两个文件的内容是:
# content of file_srs.txt, note \n is a newline symbol
APPLE\n
PEAR\n
ORANGE\n
BANANA\n
MELON\n
# content of file_rm.txt
PEAR\n
BANANA\n
我想根据file_rm.txt中的内容删除file_srs.txt中的内容。所以在这个例子中,我想删除' PEAR \ n'和' BANANA \ n'在file_srs.txt中,生成的文件是:
# resulting content in file_srs.txt
APPLE\n
ORANGE\n
MELON\n
在实际情况中,file_srs.txt中可能有数百个名称,file_rm.txt中可能有数十个名称。如此有效的方法是必要的。
感谢。
答案 0 :(得分:1)
您首先应该阅读原始<p:commandButton id="notizEintragButton" value="T" process="@this"
onclick="PF('paketNotizenDialogWV').show();" />
中的行并将此列表分配给变量。请注意,这与original.read().splitlines()
不同,文件包含:
original.readlines()
APPLE
PEAR
ORANGE
BANANA
MELON
返回original.read().splitlines()
而,
['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']
返回original.readlines()
使用实际的行字符串比使用包含['APPLE\n', 'PEAR\n', 'ORANGE\n', 'BANANA\n', 'MELON']
的行字符串更容易,因为它更容易比较;在将\n
与'BANANA\n'
进行比较之前,无需检查(例如)\n
是否'BANANA'
。
然后应使用相同的方法读入第二个文件中的数据。使用这两个列表,您可以创建一个新列表(如果您想使用以后要保留的行)或直接写入新文件:
让我们说all_lines= ['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']
和
lines_delete = ['PEAR', 'BANANA']
lines_to_keep = []
for line in all_lines:
if line not in lines_delete:
lines_to_keep.append(line)
然后可以将这些行写入新的(或相同的)文件:
with open("new.txt","w") as new:
for line in lines_to_keep:
line = line+"\n"
new.write(line)
with open("original.txt","r") as original:
all_lines = original.read().splitlines()
with open("delete.txt","r") as delete:
lines_delete = delete.read().splitlines()
print(lines_delete)
lines_to_keep = []
for line in all_lines:
if line not in lines_delete:
lines_to_keep.append(line)
with open("new.txt","w") as new:
for line in lines_to_keep:
line = line+"\n"
new.write(line)
答案 1 :(得分:0)
如果您想要速度最有效的解决方案,并且您不介意会浪费空间,您可以使用例如空格覆盖要删除的单词行(包括新行字符)。
但是,如果你不想浪费空间,你必须覆盖整个文件,即你必须将file_srs.txt的内容加载到内存中,删除file_rm.txt的所有单词和然后你必须使用内存中的新内容覆盖file_srs.txt,该文件是file_srs.txt而没有file_rm.txt中的单词。