无法记录行的删除

Unable to log deletion of a line

提问人:persimmon 提问时间:5/9/2023 最后编辑:Solomon Uckopersimmon 更新时间:5/9/2023 访问量:29

问:

我目前正在从事一个项目,在该项目中,我必须创建一个日志文件系统,其中添加新行和删除现有的文本文件记录在 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
python 设置 比较 比较 差异

评论


答:

0赞 Solomon Ucko 5/9/2023 #1

若要检查是否删除了一行,请使用与检查是否添加了一行相同的代码,但 swap 和 .linesprevious_lines

0赞 pengs 5/9/2023 #2

您可以在检查添加或删除的行的 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() 的调用,以为删除的行编写日志条目。日志条目的格式与添加行的日志条目的格式相同,但使用 - 而不是 + 表示该行已被删除。