Opening a CSV file in Python, with error handling
up vote
1
down vote
favorite
Trying to improve my function, as will be used by most of my code. I'm handling most common exception (IOError) and handling when data has no values.
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
try:
with open(filename, READ_MODE) as input_file:
data = input_file.read()
if not data:
raise ValueError('No data available')
except IOError as e:
logging.exception(e)
return data
python error-handling csv
add a comment |
up vote
1
down vote
favorite
Trying to improve my function, as will be used by most of my code. I'm handling most common exception (IOError) and handling when data has no values.
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
try:
with open(filename, READ_MODE) as input_file:
data = input_file.read()
if not data:
raise ValueError('No data available')
except IOError as e:
logging.exception(e)
return data
python error-handling csv
4
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
1
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
1
Corrected message.
– spicyramen
Aug 14 '17 at 16:21
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
Trying to improve my function, as will be used by most of my code. I'm handling most common exception (IOError) and handling when data has no values.
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
try:
with open(filename, READ_MODE) as input_file:
data = input_file.read()
if not data:
raise ValueError('No data available')
except IOError as e:
logging.exception(e)
return data
python error-handling csv
Trying to improve my function, as will be used by most of my code. I'm handling most common exception (IOError) and handling when data has no values.
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
try:
with open(filename, READ_MODE) as input_file:
data = input_file.read()
if not data:
raise ValueError('No data available')
except IOError as e:
logging.exception(e)
return data
python error-handling csv
python error-handling csv
edited Aug 14 '17 at 22:26
200_success
127k15148411
127k15148411
asked Aug 14 '17 at 7:07
spicyramen
265311
265311
4
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
1
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
1
Corrected message.
– spicyramen
Aug 14 '17 at 16:21
add a comment |
4
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
1
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
1
Corrected message.
– spicyramen
Aug 14 '17 at 16:21
4
4
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
1
1
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
1
1
Corrected message.
– spicyramen
Aug 14 '17 at 16:21
Corrected message.
– spicyramen
Aug 14 '17 at 16:21
add a comment |
2 Answers
2
active
oldest
votes
up vote
2
down vote
accepted
The only purpose of using a try/except that does not re-raise would be if it doesn't matter if there's an IOError. However, in this case, if an IOError occurs, it will be logged, then ignored and then return is going to raise a NameError - that 'data' is not defined. Since you are raising an error on empty results, I assume you handle that in the caller or want it to stop the process. In either case, I'd do something like
import logging
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
data = None
try:
with open(filename) as fobj:
data = fobj.read()
except IOError:
logging.exception('')
if not data:
raise ValueError('No data available')
return data
Also, there's no need for the with open construct if you are just reading it. With open is preferred if you do more than one thing with the file object, so it gets closed properly. By not assigning the file open to a variable, it will get closed properly and garbage collected. Keep the with open, since garbage collection is an implementation detail you should not rely on any particular behavior.
With logging.exception, all the neat stuff that you see people doing manually is already taken care of. By simply calling it with an empty string, you get the full traceback, exception type and text without doing anything else.
logging.exception('')
Is equivalent to
logging.error(''.join(traceback.format_exception(*sys.exc_info)))
or
logging.error('', exc_info=True)
add a comment |
up vote
3
down vote
Don't handle the exception in this part of the code, since it will hide errors. Just let it bubble up.
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
The only purpose of using a try/except that does not re-raise would be if it doesn't matter if there's an IOError. However, in this case, if an IOError occurs, it will be logged, then ignored and then return is going to raise a NameError - that 'data' is not defined. Since you are raising an error on empty results, I assume you handle that in the caller or want it to stop the process. In either case, I'd do something like
import logging
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
data = None
try:
with open(filename) as fobj:
data = fobj.read()
except IOError:
logging.exception('')
if not data:
raise ValueError('No data available')
return data
Also, there's no need for the with open construct if you are just reading it. With open is preferred if you do more than one thing with the file object, so it gets closed properly. By not assigning the file open to a variable, it will get closed properly and garbage collected. Keep the with open, since garbage collection is an implementation detail you should not rely on any particular behavior.
With logging.exception, all the neat stuff that you see people doing manually is already taken care of. By simply calling it with an empty string, you get the full traceback, exception type and text without doing anything else.
logging.exception('')
Is equivalent to
logging.error(''.join(traceback.format_exception(*sys.exc_info)))
or
logging.error('', exc_info=True)
add a comment |
up vote
2
down vote
accepted
The only purpose of using a try/except that does not re-raise would be if it doesn't matter if there's an IOError. However, in this case, if an IOError occurs, it will be logged, then ignored and then return is going to raise a NameError - that 'data' is not defined. Since you are raising an error on empty results, I assume you handle that in the caller or want it to stop the process. In either case, I'd do something like
import logging
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
data = None
try:
with open(filename) as fobj:
data = fobj.read()
except IOError:
logging.exception('')
if not data:
raise ValueError('No data available')
return data
Also, there's no need for the with open construct if you are just reading it. With open is preferred if you do more than one thing with the file object, so it gets closed properly. By not assigning the file open to a variable, it will get closed properly and garbage collected. Keep the with open, since garbage collection is an implementation detail you should not rely on any particular behavior.
With logging.exception, all the neat stuff that you see people doing manually is already taken care of. By simply calling it with an empty string, you get the full traceback, exception type and text without doing anything else.
logging.exception('')
Is equivalent to
logging.error(''.join(traceback.format_exception(*sys.exc_info)))
or
logging.error('', exc_info=True)
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
The only purpose of using a try/except that does not re-raise would be if it doesn't matter if there's an IOError. However, in this case, if an IOError occurs, it will be logged, then ignored and then return is going to raise a NameError - that 'data' is not defined. Since you are raising an error on empty results, I assume you handle that in the caller or want it to stop the process. In either case, I'd do something like
import logging
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
data = None
try:
with open(filename) as fobj:
data = fobj.read()
except IOError:
logging.exception('')
if not data:
raise ValueError('No data available')
return data
Also, there's no need for the with open construct if you are just reading it. With open is preferred if you do more than one thing with the file object, so it gets closed properly. By not assigning the file open to a variable, it will get closed properly and garbage collected. Keep the with open, since garbage collection is an implementation detail you should not rely on any particular behavior.
With logging.exception, all the neat stuff that you see people doing manually is already taken care of. By simply calling it with an empty string, you get the full traceback, exception type and text without doing anything else.
logging.exception('')
Is equivalent to
logging.error(''.join(traceback.format_exception(*sys.exc_info)))
or
logging.error('', exc_info=True)
The only purpose of using a try/except that does not re-raise would be if it doesn't matter if there's an IOError. However, in this case, if an IOError occurs, it will be logged, then ignored and then return is going to raise a NameError - that 'data' is not defined. Since you are raising an error on empty results, I assume you handle that in the caller or want it to stop the process. In either case, I'd do something like
import logging
READ_MODE = 'r'
def _ReadCsv(filename):
"""Read CSV file from remote path.
Args:
filename(str): filename to read.
Returns:
The contents of CSV file.
Raises:
ValueError: Unable to read file
"""
data = None
try:
with open(filename) as fobj:
data = fobj.read()
except IOError:
logging.exception('')
if not data:
raise ValueError('No data available')
return data
Also, there's no need for the with open construct if you are just reading it. With open is preferred if you do more than one thing with the file object, so it gets closed properly. By not assigning the file open to a variable, it will get closed properly and garbage collected. Keep the with open, since garbage collection is an implementation detail you should not rely on any particular behavior.
With logging.exception, all the neat stuff that you see people doing manually is already taken care of. By simply calling it with an empty string, you get the full traceback, exception type and text without doing anything else.
logging.exception('')
Is equivalent to
logging.error(''.join(traceback.format_exception(*sys.exc_info)))
or
logging.error('', exc_info=True)
edited 11 mins ago
answered Aug 14 '17 at 17:35
Wyrmwood
1363
1363
add a comment |
add a comment |
up vote
3
down vote
Don't handle the exception in this part of the code, since it will hide errors. Just let it bubble up.
add a comment |
up vote
3
down vote
Don't handle the exception in this part of the code, since it will hide errors. Just let it bubble up.
add a comment |
up vote
3
down vote
up vote
3
down vote
Don't handle the exception in this part of the code, since it will hide errors. Just let it bubble up.
Don't handle the exception in this part of the code, since it will hide errors. Just let it bubble up.
answered Aug 14 '17 at 7:12
Roland Illig
10.6k11844
10.6k11844
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f172936%2fopening-a-csv-file-in-python-with-error-handling%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
4
It's incorrect to to say you were "Unable to read file" when you successfully read an empty file.
– Peilonrayz
Aug 14 '17 at 8:07
1
Why not use Python's own csv module: devdocs.io/python~2.7/library/csv
– hjpotter92
Aug 14 '17 at 8:10
1
Corrected message.
– spicyramen
Aug 14 '17 at 16:21