From 9c65515e7a7d466be2168c65ea5a88a40cd3f248 Mon Sep 17 00:00:00 2001 From: VanL Date: Fri, 6 Jan 2012 00:12:06 +0000 Subject: [PATCH] Add detect function in _xls. Update yaml, csv, and tsv detection functions to catch other errors when faced with invalid input. --- tablib/formats/_csv.py | 4 ++-- tablib/formats/_tsv.py | 2 +- tablib/formats/_xls.py | 20 ++++++++++++++++++++ tablib/formats/_yaml.py | 4 ++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py index 3a4c374..549259c 100644 --- a/tablib/formats/_csv.py +++ b/tablib/formats/_csv.py @@ -51,5 +51,5 @@ def detect(stream): try: csv.Sniffer().sniff(stream) return True - except csv.Error: - return False \ No newline at end of file + except (csv.Error, TypeError): + return False diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index f581f81..ac9554c 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -55,5 +55,5 @@ def detect(stream): try: csv.Sniffer().sniff(stream, delimiters='\t') return True - except csv.Error: + except (csv.Error, TypeError): return False diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 89d2845..6530d91 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -6,6 +6,8 @@ import sys from tablib.compat import BytesIO, xlwt +from tablib.packages import xlrd +from tablib.packages.xlrd.biffh import XLRDError import tablib title = 'xls' @@ -16,6 +18,24 @@ wrap = xlwt.easyxf("alignment: wrap on") bold = xlwt.easyxf("font: bold on") +def detect(stream): + """Returns True if given stream is a readable excel file.""" + try: + xlrd.open_workbook(file_contents=stream) + return True + except (TypeError, XLRDError): + pass + try: + xlrd.open_workbook(file_contents=stream.read()) + return True + except (AttributeError, XLRDError): + pass + try: + xlrd.open_workbook(filename=stream) + return True + except: + return False + def export_set(dataset): """Returns XLS representation of Dataset.""" diff --git a/tablib/formats/_yaml.py b/tablib/formats/_yaml.py index 0eab78e..c9ffbd3 100644 --- a/tablib/formats/_yaml.py +++ b/tablib/formats/_yaml.py @@ -60,5 +60,5 @@ def detect(stream): return True else: return False - except yaml.parser.ParserError: - return False \ No newline at end of file + except (yaml.parser.ParserError, yaml.reader.ReaderError): + return False