Changeset 10957:660b3532fb57 in orange for Orange/data/io.py


Ignore:
Timestamp:
07/23/12 12:47:55 (21 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Handle csv.Sniffer errors.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/data/io.py

    r10899 r10957  
    599599    file = as_open_file(file, "rb") 
    600600    snifer = csv.Sniffer() 
    601     sample = file.read(5 * 2 ** 20) # max 5MB sample TODO: What if this is not enough. Try with a bigger sample 
    602     dialect = snifer.sniff(sample) 
    603      
     601 
     602    # Max 5MB sample 
     603    # TODO: What if this is not enough. Try with a bigger sample 
     604    sample = file.read(5 * 2 ** 20) 
     605    try: 
     606        dialect = snifer.sniff(sample) 
     607    except csv.Error: 
     608        # try the default, hope the provided arguments are correct 
     609        dialect = "excel" 
     610 
    604611    if has_header is None: 
    605         has_header = snifer.has_header(sample) 
    606      
    607     file.seek(0) # Rewind 
    608      
     612        try: 
     613            has_header = snifer.has_header(sample) 
     614        except csv.Error: 
     615            has_header = False 
     616 
     617    file.seek(0)  # Rewind 
     618 
    609619    def kwparams(**kwargs): 
    610620        """Return not None kwargs. 
    611621        """ 
    612622        return dict([(k, v) for k, v in kwargs.items() if v is not None]) 
    613      
     623 
     624    # non-None format parameters. 
    614625    fmtparam = kwparams(delimiter=delimiter, 
    615626                        quotechar=quotechar, 
    616627                        escapechar=escapechar, 
    617628                        skipinitialspace=skipinitialspace) 
    618      
     629 
    619630    reader = csv.reader(file, dialect=dialect, 
    620631                        **fmtparam) 
     
    623634 
    624635    row = first_row = reader.next() 
    625      
     636 
    626637    if has_header: 
    627638        header = row 
     
    632643    if has_types is None: 
    633644        has_types = has_header and is_var_types_row(row) 
    634          
     645 
    635646    if has_types: 
    636647        types = var_types(row) 
     
    642653        has_annotations = has_header and has_types and \ 
    643654                          is_var_attributes_row(row) 
    644          
     655 
    645656    if has_annotations: 
    646657        labels_row = row 
     
    652663        # Create a default header 
    653664        header = ["F_%i" % i for i in range(len(first_row))] 
    654          
     665 
    655666    if not types: 
    656667        # Create blank variable types 
    657668        types = [None] * len(header) 
    658          
     669 
    659670    if not var_attrs: 
    660671        # Create blank variable attributes 
    661672        var_attrs = [None] * len(header) 
     673    else: 
     674        # Pad the vars_attrs if it is not complete 
     675        # (orange tab format allows this line to be shorter then header). 
     676        if len(var_attrs) < len(header): 
     677            var_attrs += [None] * (len(header) - len(var_attrs)) 
    662678 
    663679    # start from the beginning 
    664680    file.seek(0) 
    665681    reader = csv.reader(file, dialect=dialect, **fmtparam) 
    666      
     682 
    667683    for defined in [has_header, has_types, has_annotations]: 
    668         if defined:  
     684        if defined: 
    669685            # skip definition rows if present in the file 
    670686            reader.next() 
    671      
     687 
    672688    variables = [] 
    673689    undefined_vars = [] 
    674     # Missing value flags  
     690    # Missing value flags 
    675691    missing_flags = DK.split(",") if DK is not None else ["?", "", "NA", "~", "*"] 
    676692    missing_map = dict.fromkeys(missing_flags, "?") 
    677693    missing_translate = lambda val: missing_map.get(val, val) 
    678      
     694 
    679695    # Create domain variables or corresponding place holders 
    680696    for i, (name, var_t) in enumerate(zip(header, types)): 
     
    712728            for ind, var_def in undefined_vars: 
    713729                var_def.values.add(row[ind]) 
    714      
    715     # Process undefined variables now that we can deduce their type  
     730 
     731    # Process undefined variables now that we can deduce their type 
    716732    for ind, var_def in undefined_vars: 
    717         values = var_def.values - set(["?", ""]) # TODO: Other unknown strings? 
     733        values = var_def.values - set(["?", ""])  # TODO: Other unknown strings 
    718734        values = sorted(values) 
    719735        if isinstance(var_def, _disc_placeholder): 
     
    779795 
    780796    class_var = class_var[0] if class_var else None 
    781      
     797 
    782798    attribute_load_status += class_var_load_status 
    783799    variable_indices = attribute_indices + class_indices 
     
    799815    return table 
    800816 
     817 
    801818def as_open_file(file, mode="rb"): 
    802819    if isinstance(file, basestring): 
    803820        file = open(file, mode) 
    804     else: # assuming it is file like with proper mode, could check for write, read 
     821    else:  # assuming it is file like with proper mode, could check for write, read 
    805822        pass 
    806823    return file 
Note: See TracChangeset for help on using the changeset viewer.