2013-07-16 37 views
0

天儿真好,特别行重写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]等代码部分不起作用。

回答

1

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

将该行更改为如果行[0]等用当前检出的工具列表重写新文件,并根据需要省略任何已被替换的工具!

+1

StackOverflow应该允许你接受你自己的答案。所以你应该这样做。 (除非你认为在这里根本不值得这样做,在这种情况下你应该删除这个问题。) – abarnert

+0

试图删除它,但我不能,因为有答案。那么我可能会接受我的答案。希望它能帮助别人。 – jars121