提问人:persimmon 提问时间:5/9/2023 最后编辑:Solomon Uckopersimmon 更新时间:5/9/2023 访问量:29
无法记录行的删除
Unable to log deletion of a line
问:
我目前正在从事一个项目,在该项目中,我必须创建一个日志文件系统,其中添加新行和删除现有的文本文件记录在 Linux 系统的日志中。但是,我在记录删除行时遇到了问题。在编码方面,我是一个新手,所以任何帮助将不胜感激!下面的代码显示了 def process_IN*_*MODIFY(self, event) 方法的代码片段。我正在使用 pyinotify 库。
with open(self.journal_files[file_path], "r") as f:
self.lines = f.readlines()
self.old_lines = self.lines.copy()
with open(self.journal_files[file_path], "a") as f:
# Check if any lines were added or removed
for i, line in enumerate(lines):
if i < len(lines) - 1:
#if len(lines) < len(self.previous_lines):
if line not in self.previous_lines and line.strip() != "":
# Check if the line was added
f.write(f"{current_time}, +, l{i+1}:{line}")
# Check if the line was removed
elif line not in self.previous_lines and len(lines) < len(self.previous_lines):
f.write(f"{current_time}, -, l{i+1}:{line}")
# if the line was in the previous lines
else:
# Check if the last line was removed
#if len(lines) <= len(self.previous_lines):
#if line not in self.previous_lines and line.strip() != "":
f.write(f"{current_time}, +, l{i+1}:{line}")
# Remember the current lines for the next time the file is modified
self.previous_lines = lines
答:
若要检查是否删除了一行,请使用与检查是否添加了一行相同的代码,但 swap 和 .lines
previous_lines
您可以在检查添加或删除的行的 for 循环中将所有“lines”实例替换为“self.lines”。其基本原理是“self.lines”是包含被读取并存储在内存中的文件行的变量,因此需要将其与“self.previous_lines”进行比较以检查更改。
您还可以更改检查是否删除了行的条件,以将self.previous_lines与 self.lines 进行比较,而不是 len(lines) 和 len(self.previous_lines)。现在,它不再比较“线”和“self.previous_lines”的长度,而是比较变量本身。这是因为仅比较长度并不一定表明删除了一条线;这也可能意味着添加了一行,这会改变文件的总长度。
with open(self.journal_files[file_path], "r") as f:
self.lines = f.readlines()
self.old_lines = self.lines.copy()
with open(self.journal_files[file_path], "a") as f:
# Check if any lines were added or removed
for i, line in enumerate(self.lines):
if i < len(self.lines) - 1:
# Check if the line was added
if line not in self.previous_lines and line.strip() != "":
f.write(f"{current_time}, +, l{i+1}:{line}")
# Check if the line was removed
elif line not in self.lines and len(self.lines) < len(self.previous_lines):
f.write(f"{current_time}, -, l{i+1}:{line}")
else:
# Check if the last line was removed
if len(self.lines) < len(self.previous_lines):
f.write(f"{current_time}, -, l{i+1}:{line}")
# Remember the current lines for the next time the file is modified
self.previous_lines = self.lines
以下是我认为可以改进的一些事情: 我在现有的 if 语句中添加了一个 else 子句,用于检查是否添加了一行。这个新的 else 子句通过检查该行是否不在 self.lines 中(即,它在 self.previous_lines 中但已被删除)来处理该行已被删除的情况。
在这个新的 else 子句中,我添加了对 f.write() 的调用,以为删除的行编写日志条目。日志条目的格式与添加行的日志条目的格式相同,但使用 - 而不是 + 表示该行已被删除。
评论