将剩余行保存到文件
Saving remaining lines to file
我有一个我读过的文件,如果文件中的行包含 "something",它将把文件保存到另一个文件,如果那么我试图将不包含它的行保存到另一个文件但它不起作用。
任何帮助表示赞赏。我仍然是 Python 的初学者,如果我遗漏了一些愚蠢的东西,我深表歉意。
with open("my.txt", errors='ignore') as f:
lines = [l for l in f if "findme" in l]
nolines = [l for l in f if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
您的代码存在问题,您只读取了文件内容一次。
我建议你先阅读内容,然后将列表拆分为两个
with open("my.txt", errors='ignore') as f:
all_lines = [l for l in f]
lines = [l for l in all_lines if "findme" in l]
nolines = [l for l in all_lines if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
不过,还有许多可以改进的地方。
问题是在第一次循环遍历文件行之后,您的文件指针指向文件末尾。解决问题的一种方法是将指针设置回 file.seek(0)
开头,例如:
with open("my.txt", errors='ignore') as f:
lines = [l for l in f if "findme" in l]
f.seek(0) # reset the file pointer position to the beginning
nolines = [l for l in f if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
但是,解决该问题的更好方法是只循环遍历行一次并随时编写行:
with open('my.txt', 'r', errors='ignore') as src_file, \
open('save.txt', 'a') as tgt1_file, \
open('remaining.txt', 'a') as tgt2_file:
for line in src_file:
print(line, file=tgt1_file if 'findme' in line else tgt2_file, end='')
这在计算方面(可能更快,但尚未测试)和内存方面(因为不需要创建可能很大的中间列表)都更短、更清晰、更高效。
请注意,此处使用 print()
会使此代码实际上 运行 比原始方法慢一些。这可以通过恢复为 file.write()
:
轻松解决
with open('my.txt', 'r', errors='ignore') as src_file, \
open('save.txt', 'a') as tgt1_file, \
open('remaining.txt', 'a') as tgt2_file:
for line in src_file:
(tgt1_file if 'findme' in line else tgt2_file).write(line)
我有一个我读过的文件,如果文件中的行包含 "something",它将把文件保存到另一个文件,如果那么我试图将不包含它的行保存到另一个文件但它不起作用。 任何帮助表示赞赏。我仍然是 Python 的初学者,如果我遗漏了一些愚蠢的东西,我深表歉意。
with open("my.txt", errors='ignore') as f:
lines = [l for l in f if "findme" in l]
nolines = [l for l in f if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
您的代码存在问题,您只读取了文件内容一次。
我建议你先阅读内容,然后将列表拆分为两个
with open("my.txt", errors='ignore') as f:
all_lines = [l for l in f]
lines = [l for l in all_lines if "findme" in l]
nolines = [l for l in all_lines if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
不过,还有许多可以改进的地方。
问题是在第一次循环遍历文件行之后,您的文件指针指向文件末尾。解决问题的一种方法是将指针设置回 file.seek(0)
开头,例如:
with open("my.txt", errors='ignore') as f:
lines = [l for l in f if "findme" in l]
f.seek(0) # reset the file pointer position to the beginning
nolines = [l for l in f if "findme" not in l]
with open("save.txt", 'a') as fi:
for listitem in lines:
fi.write(listitem)
with open("remaining.txt", 'a') as fu:
for listfail in nolines:
fu.write(listfail)
但是,解决该问题的更好方法是只循环遍历行一次并随时编写行:
with open('my.txt', 'r', errors='ignore') as src_file, \
open('save.txt', 'a') as tgt1_file, \
open('remaining.txt', 'a') as tgt2_file:
for line in src_file:
print(line, file=tgt1_file if 'findme' in line else tgt2_file, end='')
这在计算方面(可能更快,但尚未测试)和内存方面(因为不需要创建可能很大的中间列表)都更短、更清晰、更高效。
请注意,此处使用 print()
会使此代码实际上 运行 比原始方法慢一些。这可以通过恢复为 file.write()
:
with open('my.txt', 'r', errors='ignore') as src_file, \
open('save.txt', 'a') as tgt1_file, \
open('remaining.txt', 'a') as tgt2_file:
for line in src_file:
(tgt1_file if 'findme' in line else tgt2_file).write(line)