重写省略特定行的CSV文件-Python 3

重写省略特定行的CSV文件-Python 3,python,csv,rewrite,Python,Csv,Rewrite,G'day 我发布了一个问题,并从@abarnert获得了一些极好的回复。我正在尝试从CSV文件中删除特定行。我了解到CSV文件不允许删除特定的行,因此我将重写CSV,同时忽略特定的行,然后将新文件重命名为旧文件 根据链接中的上述问题,我从工具箱中获取并返回了工具。我试图重写的CSV文件是当前从工具箱中检出的工具的持续“日志”。因此,当返回工具时,我需要从日志CSV文件中删除该工具 以下是我目前掌握的情况: absent_past = frozenset(tuple(row) for row i

G'day

我发布了一个问题,并从@abarnert获得了一些极好的回复。我正在尝试从CSV文件中删除特定行。我了解到CSV文件不允许删除特定的行,因此我将重写CSV,同时忽略特定的行,然后将新文件重命名为旧文件

根据链接中的上述问题,我从工具箱中获取并返回了工具。我试图重写的CSV文件是当前从工具箱中检出的工具的持续“日志”。因此,当返回工具时,我需要从日志CSV文件中删除该工具

以下是我目前掌握的情况:

absent_past = frozenset(tuple(row) for row in csv.reader(open('Absent_Past.csv', 'r')))
absent_current = frozenset(tuple(row) for row in csv.reader(open('Absent_Current.csv', 'r')))

tools_returned = [",".join(row) for row in absent_past - absent_current]

with open('Log.csv') as f:
    check = csv.reader(f)
    for row in check:
        if row[1] not in tools_returned:
            csv.writer(open('Log_Current.csv', 'a+')).writerow(row)

os.remove('Log.csv')
os.rename('Log_Current.csv', 'Log.csv')
正如您可以(希望)从上面看到的,它将打开Log.csv文件,如果工具已返回(即该工具列在tools_returned中的一行),它将不会将该条目重写到新文件中。将所有未返回的工具写入新文件后,旧文件将被删除,新文件将从Log_Current.csv重命名为Log.csv

值得一提的是,在重命名Log_Current.csv之前,所使用的工具会被附加到Log_Current.csv中。这部分代码运行良好:)

我被指示避免在这个系统中使用CSV,我同意这一点。我想在这一点上尽可能多地探索Python下的CSV操作,但我知道它在将来会派上用场。我将期待在将来使用contextlib和shelve函数

谢谢

编辑:在上面的代码中,我有if行[1]…我希望这意味着它将只检查行中第一列的值?基本上,该行将由类似Hammer、James、Take、09:15:25的内容组成,但我只想在Log.csv文件中搜索Hammer,因为返回的工具仅由工具名称行组成,即Hammer、Drill、Saw等。行[1]方法对此是否正确


此时,无论工具是否已更换,Log_Current.csv文件都会写入Log.csv文件。因此,我认为代码的if行[1]等部分不起作用。

我想我应该回答我自己的问题,因为我现在已经明白了。上面公布的代码是正确的,除了一个小错误。当引用行中的列号时,第一列是第0列,而不是第1列。当我在“1”列中搜索工具名称时,它永远不会起作用,因为“1”列实际上是第二列,即用户的名称


将该行更改为if row[0]etc将使用当前签出的工具列表重写新文件,并根据需要忽略任何已替换的工具

StackOverflow应该允许您接受自己的答案。所以你应该这么做。(除非你认为这根本不值得放在这里,在这种情况下,你应该删除这个问题。)只是尝试删除它,但我不能,因为有答案。我可能会接受我的答案。希望它能帮助其他人。