检查输入和输出文件在Python中是不一样的

时间:2017-07-05 12:50:29

标签: python

我有一个python脚本,它接受两个参数,输入和输出文件的名称,即它的开始类似

inputFile=open(sys.argv[1],'r')
outFile=open(sys.argv[2],'w')

然后执行从inputFile读取的任何操作并写入outFile。

现在通过人为错误几次我不小心给出了相同的参数两次,结果是我的输入文件被替换为空行。是否有直接的方法来阻止这种情况发生?

我认为这可能就像添加

一样简单
if sys.argv[1]==sys.argv[2]:
        inputFile.close()
        outFile.close()

紧接在上面的第一行之后,但这已经将文件留空了。

3 个答案:

答案 0 :(得分:2)

简单地说:

import os
if os.path.realpath(sys.argv[1]) != os.path.realpath(sys.argv[2]):
   inputFile=open(sys.argv[1],'r')
   outFile=open(sys.argv[2],'w')
else:
   raise ValueError('Input and output files are the same')

这可以通过引发不会破坏输入文件的欢迎错误来防止人为错误。

os.path.realpath会将任何相对路径转换为绝对路径,这样即使字符串不同,也可以在绝对路径相同时引发错误(感谢@ Jean-FrançoisFabre提醒我这一点)

答案 1 :(得分:1)

打开要写入的文件会立即截断文件,因此在比较字符串时已经完成了损坏。

那说:

  • 在Windows文件系统上,保护是“内置的”,因为如果文件作为读取模式打开,它不能同时作为写入模式打开:良好(网络文件系统有“灰色区域”,尽管)
  • 在Linux / Unix上,存在风险。但比较名称是不够的。如果两个不同的路径都指向同一个文件怎么办? (考虑:foo/bar/mydrive/foo/barfoo/../barbar

在比较之前,您可以在两个文件上使用os.path.realpath()来解析可能不同的相对路径(这不会解决符号链接问题,但总比没有好)

对于窗户“灰色区域”我提到,比较名称的小写版本将是一个好主意。

答案 2 :(得分:0)

输入文件变为空白,因为open(文件名,'w')会覆盖任何需要放入文件的文件。 'w'对文件创建很有用,然后写入该文件。我建议尝试打开(文件名,'a')来附加一个预先存在的文件。我不记得这是否会创建一个文件,如果它尚未存在,但听起来你已经有2个现有文件,所以追加应该是你需要的。

如果您决定使用if sys.argv [1] == sys.argv [2]方法,请尝试在您要比较的每个项目周围放置str(),以确保它正确比较它们。