天儿真好,特别行重写CSV文件中省略 - 的Python 3
我张贴this问题,不得不从@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和搁置功能。
谢谢!
编辑:在上面的代码中,我有如果行[1] ...我希望它意味着它只会检查行中的第一列的值?基本上,该行将包含Hammer,James,Taken,09:15:25之类的内容,但我只想搜索Hammer的Log.csv文件,因为tools_returned仅包含工具名称行,即。锤子,钻子,锯子等。[1]行是否正确?
目前,Log_Current.csv文件正在写入Log.csv文件,无论该工具是否已被替换。因此,我认为if行[1]等代码部分不起作用。
StackOverflow应该允许你接受你自己的答案。所以你应该这样做。 (除非你认为在这里根本不值得这样做,在这种情况下你应该删除这个问题。) – abarnert
试图删除它,但我不能,因为有答案。那么我可能会接受我的答案。希望它能帮助别人。 – jars121