天,
我发布了这个问题,并从@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的。这部分代码运行良好:)
我被指示避免在该系统中使用 CSV,我同意这一点。我现在想尽可能多地探索 Python 下的 CSV 操作,因为我知道它将来会派上用场。我将寻求在未来使用 contextlib 和 shelve 函数。
谢谢!
编辑:在上面的代码中,我有 if row[1]... 我希望这意味着它只会检查行中第一列的值?基本上,该行将包含诸如 Hammer、James、Taken、09:15:25 之类的内容,但我只想在 Log.csv 文件中搜索 Hammer,因为 tools_returned 仅包含工具名称行,即。锤子、钻头、锯子等。 row[1] 方法对此是否正确?
目前,无论工具是否被替换,Log_Current.csv 文件都在写入 Log.csv 文件。因此,我认为代码的 if row[1] 等部分不起作用。