Я хочу прочитать файл .csv на Python.
- Я не знаю, существует ли файл.
- Мое текущее решение ниже. Мне это кажется неряшливым, потому что два отдельных теста исключения неудобно сопоставлены.
Есть способ сделать это красивее?
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
python
python-2.7
exception
file-io
Чарльз Холброу
источник
источник
try
может стоить того. Это можно сделать с помощьюos.path.exists(file)
иos.access(file, os.R_OK)
соответственно. Такая проверка никогда не может быть свободна от состояния гонки, но исчезновение файлов редко является нормальным явлением;)pathlib
модуля, который значительно упрощает эту проблему и, вероятно, должен быть стандартной практикой Python (тем более, что он также был перенесен на 2.7).IOError
, он не улавливаетcsv.Error
из-за того, что файл не является форматом CSV, когдаDialect.strict=True
илиError
для каких-либо других ошибок (в соответствии с документами пакета CSV), поэтому существует внешняя попытка или просто проверка файла, тогда внутренняя попытка для исключений CSV наверное правильный ответ.Ответы:
Думаю, я неправильно понял, о чем спрашивали. Перечитывая, похоже, что ответ Тима - это то, что вы хотите. Однако позвольте мне просто добавить следующее: если вы хотите перехватить исключение из
open
, тоopen
оно должно быть заключено вtry
. Если вызовopen
находится в заголовке awith
, тоwith
он должен быть в a,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
источник
fName
может быть имя какого-то файла, который, даже если он застрял, не может быть открыт по какой-либо причине - например, если это каталог или нет разрешений, позволяющих его читать выполняющему процессу.Как насчет этого:
try: f = open(fname, 'rb') except OSError: print "Could not open/read file:", fname sys.exit() with f: reader = csv.reader(f) for row in reader: pass #do stuff here
источник
with
блока. Поэтому, если междуtry
блоком, содержащим вызов,open
иwith
оператором возникает исключение , файл не закрывается. В этом случае, когда все очень просто, это не очевидная проблема, но все же может представлять опасность при рефакторинге или ином изменении кода. При этом я не думаю, что есть лучший способ сделать это (кроме оригинальной версии).FileNotFoundError.mro()
есть[<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
иIOError.mro()
есть[<class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
. Как насчет использования одногоOSError
илиException
вместо него? ``Вот пример чтения / записи. Операторы 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"
источник
fname = 'filenotfound.txt' try: f = open(fname, 'rb') except FileNotFoundError: print("file {} does not exist".format(fname)) file filenotfound.txt does not exist
исключение FileNotFoundError Возникает, когда файл или каталог запрашиваются, но не существуют. Соответствует ошибке ENOENT.
https://docs.python.org/3/library/exceptions.html
Это исключение не существует в Python 2.
источник
Добавление к примеру @Josh;
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), предупредите пользователя!
источник
bool(IOError)
это простоTrue
иif
не обнаруживает никаких исключений.>>> if IOError: print "That's not an exception handler"