如何根据其他文件的内容删除txt文件中的行,Python3
how to delete lines in txt file, according to other files' content, Python3
我有两个 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中的内容。所以在这个例子中,我想删除 file_srs.txt 中的 'PEAR\n' 和 'BANANA\n',结果文件是:
# resulting content in file_srs.txt
APPLE\n
ORANGE\n
MELON\n
在实际情况下,file_srs.txt可以有几百个名字,file_rm.txt可以有几十个名字。所以高效的方法是必要的。
谢谢。
如果你想要最高效的速度解决方案并且你不介意会有浪费space,你可以覆盖要删除的单词行(包括换行符)例如 spaces.
但是,如果你不想浪费space,你必须覆盖整个文件,即你必须将file_srs.txt的内容加载到内存中,删除所有单词file_rm.txt 然后你必须用内存中的新内容覆盖 file_srs.txt,即 file_srs.txt 没有 file_rm.txt.
中的单词
您首先应该阅读原文中的行 original.read().splitlines()
并将此列表分配给一个变量。请注意,这与 original.readlines()
不同,因为文件包含:
APPLE
PEAR
ORANGE
BANANA
MELON
original.read().splitlines()
returns ['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']
然而,
original.readlines()
returns ['APPLE\n', 'PEAR\n', 'ORANGE\n', 'BANANA\n', 'MELON']
使用实际的行字符串比使用包含 \n
的行字符串更容易,因为它更容易比较;在将它与 'BANANA'
.
进行比较之前,无需检查(例如)'BANANA\n'
是否具有 \n
然后用同样的方法读入第二个文件的数据。使用这两个列表,您可以创建一个新列表(如果您想要处理您希望稍后保留的行)或直接写入一个新文件:
假设 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)
我有两个 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中的内容。所以在这个例子中,我想删除 file_srs.txt 中的 'PEAR\n' 和 'BANANA\n',结果文件是:
# resulting content in file_srs.txt
APPLE\n
ORANGE\n
MELON\n
在实际情况下,file_srs.txt可以有几百个名字,file_rm.txt可以有几十个名字。所以高效的方法是必要的。
谢谢。
如果你想要最高效的速度解决方案并且你不介意会有浪费space,你可以覆盖要删除的单词行(包括换行符)例如 spaces.
但是,如果你不想浪费space,你必须覆盖整个文件,即你必须将file_srs.txt的内容加载到内存中,删除所有单词file_rm.txt 然后你必须用内存中的新内容覆盖 file_srs.txt,即 file_srs.txt 没有 file_rm.txt.
中的单词您首先应该阅读原文中的行 original.read().splitlines()
并将此列表分配给一个变量。请注意,这与 original.readlines()
不同,因为文件包含:
APPLE
PEAR
ORANGE
BANANA
MELON
original.read().splitlines()
returns ['APPLE', 'PEAR', 'ORANGE', 'BANANA', 'MELON']
然而,
original.readlines()
returns ['APPLE\n', 'PEAR\n', 'ORANGE\n', 'BANANA\n', 'MELON']
使用实际的行字符串比使用包含 \n
的行字符串更容易,因为它更容易比较;在将它与 'BANANA'
.
'BANANA\n'
是否具有 \n
然后用同样的方法读入第二个文件的数据。使用这两个列表,您可以创建一个新列表(如果您想要处理您希望稍后保留的行)或直接写入一个新文件:
假设 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)