2016-02-12 45 views
0

打开一个正在退出的文件并向其中写入字典时,有时会将字典(正在写入一行)追加到上一行的末尾。我如何设置这个代码来防止这种情况发生?它似乎只发生在先前的代码'run'崩溃并且我重新启动了代码,并且它开始写入前一次运行的文件(我想要的 - 只是没有添加到前一行的末尾)。Python - 有时将一个CSV文件的附加行添加到前一行的末尾

 #Creating output dictwriter for results 
     with open(csv, 'a', 0) as outputFile: 
      fieldnames = csvCols 
      successWriter = csv.DictWriter(outputFile, fieldnames=fieldnames) 
      successWriter.writerow(out_dict) 
     outputFile.close() 

打开文件'ab'模式会有所作为吗?

+0

是从“撞车”的文件在最后一行的末尾缺少一个换行符?它是否像打开文件追加之前检查文件的最后一行换行符一样简单? – mhopeng

+0

请注意,您不需要'outputFile.close()'行,因为'with'语句会自动为您关闭文件。 –

+0

是的,他们是 - 我不知道该怎么做。而且我也认为这不是必要的,因为我确信可以通过某种方法确保总是写一个换行符。因为,而这正是我感到困惑的地方,当脚本崩溃时,文件始终是关闭的 - 也就是说,崩溃不会发生在上面的代码中,而是出现在代码之前或之后的代码中 - 但是文件是在这些情况下不开放或关闭并已写入。 – traggatmot

回答

0

您通常会在文件行中添加“\ n”,以便写入下一行。

+0

写入文件正常进行时会自动发生。但是,如果调用上述代码的脚本崩溃了,并且我重新启动它,它会将第一个新写入的行附加到最后一个写入的行,然后正常继续,每次调用时都会自动创建新行。你的回答似乎没有解决这样一个事实,即大部分时间它都会自行处理新的字符。 – traggatmot

+0

那么如果文件将项目添加到文档中,代码就不会崩溃。该文档仅在碰撞时更新.close() – user5823815

+0

不,它可能在写入之前的某个部分发生崩溃。正在编写的内容是从某些Web服务中提取的 - 这一部分不太可能崩溃或导致崩溃,但有时Web服务产生的输出是垃圾,并且可能导致代码段所在的较大脚本崩溃。如果发生这种情况,并且我重新启动较大的脚本,它将再次处理Web服务结果,并开始写入已存在的文件,第一次无法写入新行并在其他时间成功。理解? – traggatmot

0

以下应在Python 2.x的正常工作:

# Creating output dictwriter for results 

with open(csv, 'ab') as outputFile: 
    successWriter = csv.DictWriter(outputFile, fieldnames=csvCols) 
    successWriter.writerow(out_dict) 

with声明将自动关闭您的文件,即使是你的脚本有问题。如果您不使用ab模式,则每次调用writerow会导致额外的空行。

如果您正在使用Python 3.x中,你将需要:

# Creating output dictwriter for results 

with open(csv, 'a', newline='') as outputFile: 
    successWriter = csv.DictWriter(outputFile, fieldnames=csvCols) 
    successWriter.writerow(out_dict) 
相关问题