2011-04-11 31 views
32

我想在Python中读取.csv文件。尝试在python中读取文件时处理异常的好方法是什么?

  • 我不知道,如果该文件存在。
  • 我现在的解决方案如下。这对我来说很sl because,因为这两个单独的异常测试并不合时宜。

有更漂亮的方式做到这一点?

import csv  
fName = "aFile.csv" 

try: 
    with open(fName, 'rb') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      pass #do stuff here 

except IOError: 
    print "Could not read file:", fName 
+0

如果不存在的文件是不是一个错误的情况下,但随后可能的情况下检查,并明确之前处理它的缺失/非可读性(和*另外*到)'try'可能是值得的。这可以分别用'os.path.exists(file)'和'os.access(file,os.R_OK)'完成。这样的检查永远不会出现竞争状态,但是消失的文件很少是正常的情况;) – stefanct 2017-04-08 14:50:34

+1

这个问题的答案可能应该更新为包含'pathlib'模块的使用,这使得这个问题变得更加容易,并且应该可能是标准的Python练习(特别是因为它也回到了2.7)。 – 2017-07-03 13:56:31

回答

17

我想我误解了被问到的内容。重新阅读,看起来蒂姆的答案就是你想要的。让我补充这一点,但是:如果你想从open捕捉异常,然后open必须被包裹在一个try。如果调用open处于with的头,然后with必须在try捕获异常。这是没有办法的。

因此,答案可以是:“蒂姆的方式”或“不,你做正确。”


上一页无益的答案,所有的评论是指:

import os 

if os.path.exists(fName): 
    with open(fName, 'rb') as f: 
     try: 
      # do stuff 
     except : # whatever reader errors you care about 
      # handle error 

+7

仅仅因为一个文件存在并不意味着你可以阅读它! – Gabe 2011-04-11 20:59:03

+1

这并不完美,因为可能会在检查文件存在并尝试打开文件之间删除文件(例如,由另一个进程删除)。 – 2011-04-11 20:59:22

+0

也许我误解了这个问题。其实我觉得我确实是。 – 2011-04-11 21:00:38

17

如何:

try: 
    f = open(fname, 'rb') 
except IOError: 
    print "Could not read file:", fname 
    sys.exit() 

with f: 
    reader = csv.reader(f) 
    for row in reader: 
     pass #do stuff here 
+5

唯一的问题是该文件是在'with'块之外打开的。因此,如果包含'open'调用的'try'块和'with'语句之间发生异常,则文件不会关闭。在这种情况下,事情非常简单,这不是一个明显的问题,但是在重构或修改代码时仍然可能会造成危险。这就是说,我认为没有更好的方法来做到这一点(除了原始版本)。 – intuited 2011-04-11 21:12:24

+1

@intuited:是的。事实上,OP的最终答案可能只是:不,你做这件事的方式是正确的。 – 2011-04-11 21:20:36

-3

添加到@乔希的例子;

fName = [FILE TO OPEN] 
if os.path.exists(fName): 
    with open(fName, 'rb') as f: 
     #add you code to handle the file contents here. 
elif IOError: 
    print "Unable to open file: "+str(fName) 

这样你可以尝试打开文件,但如果它不存在(如果它引发IOError),提醒用户!

+2

'elif IOError'?真的吗?另请参阅@ Josh提案的评论,该评论至少可以正确地使用语法。 – delnan 2011-04-11 21:17:52

+0

没有看到问题。如果语法不正确,它会在执行时引发语法错误! – 2011-04-11 21:22:20

+4

不是语法错误,但'bool(IOError)'只是'True','if'不会捕获任何异常。 – delnan 2011-04-11 21:23:23

6

这里是一个读/写的例子。 with语句确保close()语句将由文件对象调用,而不管是否抛出异常。 http://effbot.org/zone/python-with-statement.htm

import sys 

fIn = 'symbolsIn.csv' 
fOut = 'symbolsOut.csv' 

try: 
    with open(fIn, 'r') as f: 
     file_content = f.read() 
     print "read file " + fIn 
    if not file_content: 
     print "no data in file " + fIn 
     file_content = "name,phone,address\n" 
    with open(fOut, 'w') as dest: 
     dest.write(file_content) 
     print "wrote file " + fOut 
except IOError as e: 
    print "I/O error({0}): {1}".format(e.errno, e.strerror) 
except: #handle other exceptions such as attribute errors 
    print "Unexpected error:", sys.exc_info()[0] 
print "done" 
相关问题