0

天,

我发布了这个问题,并从@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] 等部分不起作用。

4

1 回答 1

1

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

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

于 2013-07-16T23:00:45.397 回答