Python运行报错UnicodeDecodeError的解决方法

时间:2021-10-30 07:32:06

Python2.7在Windows上有一个bug,运行报错:

?
1
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 33: ordinal not in range(128)

解决方案如下:

编辑Python27\Lib\mimetypes.py文件,全选,替换为以下patch后的正确脚本,或者直接依据此patch修改:

  1. """Guess the MIME type of a file. 
  2.   
  3. This module defines two useful functions: 
  4.   
  5. guess_type(url, strict=1) -- guess the MIME type and encoding of a URL. 
  6.   
  7. guess_extension(type, strict=1) -- guess the extension for a given MIME type. 
  8.   
  9. It also contains the following, for tuning the behavior: 
  10.   
  11. Data: 
  12.   
  13. knownfiles -- list of files to parse 
  14. inited -- flag set when init() has been called 
  15. suffix_map -- dictionary mapping suffixes to suffixes 
  16. encodings_map -- dictionary mapping suffixes to encodings 
  17. types_map -- dictionary mapping suffixes to types 
  18.   
  19. Functions: 
  20.   
  21. init([files]) -- parse a list of files, default knownfiles (on Windows, the 
  22.  default values are taken from the registry) 
  23. read_mime_types(file) -- parse one file, return a dictionary or None 
  24. ""
  25. from itertools import count 
  26.   
  27. import os 
  28. import sys 
  29. import posixpath 
  30. import urllib 
  31. try
  32.  import _winreg 
  33. except ImportError: 
  34.  _winreg = None 
  35.   
  36. __all__ = [ 
  37.  "guess_type","guess_extension","guess_all_extensions"
  38.  "add_type","read_mime_types","init" 
  39.   
  40. knownfiles = [ 
  41.  "/etc/mime.types"
  42.  "/etc/httpd/mime.types",     # Mac OS X 
  43.  "/etc/httpd/conf/mime.types",    # Apache 
  44.  "/etc/apache/mime.types",     # Apache 1 
  45.  "/etc/apache2/mime.types",     # Apache 2 
  46.  "/usr/local/etc/httpd/conf/mime.types"
  47.  "/usr/local/lib/netscape/mime.types"
  48.  "/usr/local/etc/httpd/conf/mime.types",  # Apache 1.2 
  49.  "/usr/local/etc/mime.types",    # Apache 1.3 
  50.  ] 
  51.   
  52. inited = False 
  53. _db = None 
  54.   
  55.   
  56. class MimeTypes: 
  57.  """MIME-types datastore. 
  58.   
  59.  This datastore can handle information from mime.types-style files 
  60.  and supports basic determination of MIME type from a filename or 
  61.  URL, and can guess a reasonable extension given a MIME type. 
  62.  ""
  63.   
  64.  def __init__(self, filenames=(), strict=True): 
  65.   if not inited: 
  66.    init() 
  67.   self.encodings_map = encodings_map.copy() 
  68.   self.suffix_map = suffix_map.copy() 
  69.   self.types_map = ({}, {}) # dict for (non-strict, strict) 
  70.   self.types_map_inv = ({}, {}) 
  71.   for (ext, type) in types_map.items(): 
  72.    self.add_type(type, ext, True) 
  73.   for (ext, type) in common_types.items(): 
  74.    self.add_type(type, ext, False) 
  75.   for name in filenames: 
  76.    self.read(name, strict) 
  77.   
  78.  def add_type(self, type, ext, strict=True): 
  79.   """Add a mapping between a type and an extension. 
  80.   
  81.   When the extension is already known, the new 
  82.   type will replace the old one. When the type 
  83.   is already known the extension will be added 
  84.   to the list of known extensions. 
  85.   
  86.   If strict is true, information will be added to 
  87.   list of standard types, else to the list of non-standard 
  88.   types. 
  89.   ""
  90.   self.types_map[strict][ext] = type 
  91.   exts = self.types_map_inv[strict].setdefault(type, []) 
  92.   if ext not in exts: 
  93.    exts.append(ext) 
  94.   
  95.  def guess_type(self, url, strict=True): 
  96.   """Guess the type of a file based on its URL. 
  97.   
  98.   Return value is a tuple (type, encoding) where type is None if 
  99.   the type can't be guessed (no or unknown suffix) or a string 
  100.   of the form type/subtype, usable for a MIME Content-type 
  101.   header; and encoding is None for no encoding or the name of 
  102.   the program used to encode (e.g. compress or gzip). The 
  103.   mappings are table driven. Encoding suffixes are case 
  104.   sensitive; type suffixes are first tried case sensitive, then 
  105.   case insensitive. 
  106.   
  107.   The suffixes .tgz, .taz and .tz (case sensitive!) are all 
  108.   mapped to '.tar.gz'. (This is table-driven too, using the 
  109.   dictionary suffix_map.) 
  110.   
  111.   Optional `strict' argument when False adds a bunch of commonly found, 
  112.   but non-standard types. 
  113.   ""
  114.   scheme, url = urllib.splittype(url) 
  115.   if scheme == 'data'
  116.    # syntax of data URLs: 
  117.    # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data 
  118.    # mediatype := [ type "/" subtype ] *( ";" parameter ) 
  119.    # data  := *urlchar 
  120.    # parameter := attribute "=" value 
  121.    # type/subtype defaults to "text/plain" 
  122.    comma = url.find(','
  123.    if comma < 0: 
  124.     # bad data URL 
  125.     return None, None 
  126.    semi = url.find(';', 0, comma) 
  127.    if semi >= 0: 
  128.     type = url[:semi] 
  129.    else
  130.     type = url[:comma] 
  131.    if '=' in type or '/' not in type: 
  132.     type = 'text/plain' 
  133.    return type, None   # never compressed, so encoding is None 
  134.   base, ext = posixpath.splitext(url) 
  135.   while ext in self.suffix_map: 
  136.    base, ext = posixpath.splitext(base + self.suffix_map[ext]) 
  137.   if ext in self.encodings_map: 
  138.    encoding = self.encodings_map[ext] 
  139.    base, ext = posixpath.splitext(base) 
  140.   else
  141.    encoding = None 
  142.   types_map = self.types_map[True] 
  143.   if ext in types_map: 
  144.    return types_map[ext], encoding 
  145.   elif ext.lower() in types_map: 
  146.    return types_map[ext.lower()], encoding 
  147.   elif strict: 
  148.    return None, encoding 
  149.   types_map = self.types_map[False] 
  150.   if ext in types_map: 
  151.    return types_map[ext], encoding 
  152.   elif ext.lower() in types_map: 
  153.    return types_map[ext.lower()], encoding 
  154.   else
  155.    return None, encoding 
  156.   
  157.  def guess_all_extensions(self, type, strict=True): 
  158.   """Guess the extensions for a file based on its MIME type. 
  159.   
  160.   Return value is a list of strings giving the possible filename 
  161.   extensions, including the leading dot ('.'). The extension is not 
  162.   guaranteed to have been associated with any particular data stream, 
  163.   but would be mapped to the MIME type `type' by guess_type(). 
  164.   
  165.   Optional `strict' argument when false adds a bunch of commonly found, 
  166.   but non-standard types. 
  167.   ""
  168.   type = type.lower() 
  169.   extensions = self.types_map_inv[True].get(type, []) 
  170.   if not strict: 
  171.    for ext in self.types_map_inv[False].get(type, []): 
  172.     if ext not in extensions: 
  173.      extensions.append(ext) 
  174.   return extensions 
  175.   
  176.  def guess_extension(self, type, strict=True): 
  177.   """Guess the extension for a file based on its MIME type. 
  178.   
  179.   Return value is a string giving a filename extension, 
  180.   including the leading dot ('.'). The extension is not 
  181.   guaranteed to have been associated with any particular data 
  182.   stream, but would be mapped to the MIME type `type' by 
  183.   guess_type(). If no extension can be guessed for `type', None 
  184.   is returned. 
  185.   
  186.   Optional `strict' argument when false adds a bunch of commonly found, 
  187.   but non-standard types. 
  188.   ""
  189.   extensions = self.guess_all_extensions(type, strict) 
  190.   if not extensions: 
  191.    return None 
  192.   return extensions[0] 
  193.   
  194.  def read(self, filename, strict=True): 
  195.   ""
  196.   Read a single mime.types-format file, specified by pathname. 
  197.   
  198.   If strict is true, information will be added to 
  199.   list of standard types, else to the list of non-standard 
  200.   types. 
  201.   ""
  202.   with open(filename) as fp: 
  203.    self.readfp(fp, strict) 
  204.   
  205.  def readfp(self, fp, strict=True): 
  206.   ""
  207.   Read a single mime.types-format file. 
  208.   
  209.   If strict is true, information will be added to 
  210.   list of standard types, else to the list of non-standard 
  211.   types. 
  212.   ""
  213.   while 1: 
  214.    line = fp.readline() 
  215.    if not line: 
  216.     break 
  217.    words = line.split() 
  218.    for i in range(len(words)): 
  219.     if words[i][0] == '#'
  220.      del words[i:] 
  221.      break 
  222.    if not words: 
  223.     continue 
  224.    type, suffixes = words[0], words[1:] 
  225.    for suff in suffixes: 
  226.     self.add_type(type, '.' + suff, strict) 
  227.   
  228.  def read_windows_registry(self, strict=True): 
  229.   ""
  230.   Load the MIME types database from Windows registry. 
  231.   
  232.   If strict is true, information will be added to 
  233.   list of standard types, else to the list of non-standard 
  234.   types. 
  235.   ""
  236.   
  237.   # Windows only 
  238.   if not _winreg: 
  239.    return 
  240.   
  241.   def enum_types(mimedb): 
  242.    for i in count(): 
  243.     try
  244.      yield _winreg.EnumKey(mimedb, i) 
  245.     except EnvironmentError: 
  246.      break 
  247.   
  248.   default_encoding = sys.getdefaultencoding() 
  249.   with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: 
  250.    for subkeyname in enum_types(hkcr): 
  251.     try
  252.      with _winreg.OpenKey(hkcr, subkeyname) as subkey: 
  253.       # Only check file extensions 
  254.       if not subkeyname.startswith("."): 
  255.        continue 
  256.       # raises EnvironmentError if no 'Content Type' value 
  257.       mimetype, datatype = _winreg.QueryValueEx( 
  258.        subkey, 'Content Type'
  259.       if datatype != _winreg.REG_SZ: 
  260.        continue 
  261.       try
  262.        mimetype = mimetype.encode(default_encoding) 
  263.        subkeyname = subkeyname.encode(default_encoding) 
  264.       except UnicodeEncodeError: 
  265.        continue 
  266.       self.add_type(mimetype, subkeyname, strict) 
  267.     except EnvironmentError: 
  268.      continue 
  269.   
  270. def guess_type(url, strict=True): 
  271.  """Guess the type of a file based on its URL. 
  272.   
  273.  Return value is a tuple (type, encoding) where type is None if the 
  274.  type can't be guessed (no or unknown suffix) or a string of the 
  275.  form type/subtype, usable for a MIME Content-type header; and 
  276.  encoding is None for no encoding or the name of the program used 
  277.  to encode (e.g. compress or gzip). The mappings are table 
  278.  driven. Encoding suffixes are case sensitive; type suffixes are 
  279.  first tried case sensitive, then case insensitive. 
  280.   
  281.  The suffixes .tgz, .taz and .tz (case sensitive!) are all mapped 
  282.  to ".tar.gz". (This is table-driven too, using the dictionary 
  283.  suffix_map). 
  284.   
  285.  Optional `strict' argument when false adds a bunch of commonly found, but 
  286.  non-standard types. 
  287.  ""
  288.  if _db is None: 
  289.   init() 
  290.  return _db.guess_type(url, strict) 
  291.   
  292.   
  293. def guess_all_extensions(type, strict=True): 
  294.  """Guess the extensions for a file based on its MIME type. 
  295.   
  296.  Return value is a list of strings giving the possible filename 
  297.  extensions, including the leading dot ('.'). The extension is not 
  298.  guaranteed to have been associated with any particular data 
  299.  stream, but would be mapped to the MIME type `type' by 
  300.  guess_type(). If no extension can be guessed for `type', None 
  301.  is returned. 
  302.   
  303.  Optional `strict' argument when false adds a bunch of commonly found, 
  304.  but non-standard types. 
  305.  ""
  306.  if _db is None: 
  307.   init() 
  308.  return _db.guess_all_extensions(type, strict) 
  309.   
  310. def guess_extension(type, strict=True): 
  311.  """Guess the extension for a file based on its MIME type. 
  312.   
  313.  Return value is a string giving a filename extension, including the 
  314.  leading dot ('.'). The extension is not guaranteed to have been 
  315.  associated with any particular data stream, but would be mapped to the 
  316.  MIME type `type' by guess_type(). If no extension can be guessed for 
  317.  `type', None is returned. 
  318.   
  319.  Optional `strict' argument when false adds a bunch of commonly found, 
  320.  but non-standard types. 
  321.  ""
  322.  if _db is None: 
  323.   init() 
  324.  return _db.guess_extension(type, strict) 
  325.   
  326. def add_type(type, ext, strict=True): 
  327.  """Add a mapping between a type and an extension. 
  328.   
  329.  When the extension is already known, the new 
  330.  type will replace the old one. When the type 
  331.  is already known the extension will be added 
  332.  to the list of known extensions. 
  333.   
  334.  If strict is true, information will be added to 
  335.  list of standard types, else to the list of non-standard 
  336.  types. 
  337.  ""
  338.  if _db is None: 
  339.   init() 
  340.  return _db.add_type(type, ext, strict) 
  341.   
  342.   
  343. def init(files=None): 
  344.  global suffix_map, types_map, encodings_map, common_types 
  345.  global inited, _db 
  346.  inited = True # so that MimeTypes.__init__() doesn't call us again 
  347.  db = MimeTypes() 
  348.  if files is None: 
  349.   if _winreg: 
  350.    db.read_windows_registry() 
  351.   files = knownfiles 
  352.  for file in files: 
  353.   if os.path.isfile(file): 
  354.    db.read(file) 
  355.  encodings_map = db.encodings_map 
  356.  suffix_map = db.suffix_map 
  357.  types_map = db.types_map[True] 
  358.  common_types = db.types_map[False] 
  359.  # Make the DB a global variable now that it is fully initialized 
  360.  _db = db 
  361.   
  362.   
  363. def read_mime_types(file): 
  364.  try
  365.   f = open(file) 
  366.  except IOError: 
  367.   return None 
  368.  db = MimeTypes() 
  369.  db.readfp(f, True) 
  370.  return db.types_map[True] 
  371.   
  372.   
  373. def _default_mime_types(): 
  374.  global suffix_map 
  375.  global encodings_map 
  376.  global types_map 
  377.  global common_types 
  378.   
  379.  suffix_map = { 
  380.   '.tgz''.tar.gz'
  381.   '.taz''.tar.gz'
  382.   '.tz''.tar.gz'
  383.   '.tbz2''.tar.bz2'
  384.   '.txz''.tar.xz'
  385.   } 
  386.   
  387.  encodings_map = { 
  388.   '.gz''gzip'
  389.   '.Z''compress'
  390.   '.bz2''bzip2'
  391.   '.xz''xz'
  392.   } 
  393.   
  394.  # Before adding new types, make sure they are either registered with IANA, 
  395.  # at http://www.isi.edu/in-notes/iana/assignments/media-types 
  396.  # or extensions, i.e. using the x- prefix 
  397.   
  398.  # If you add to these, please keep them sorted! 
  399.  types_map = { 
  400.   '.a'  : 'application/octet-stream'
  401.   '.ai'  : 'application/postscript'
  402.   '.aif' : 'audio/x-aiff'
  403.   '.aifc' : 'audio/x-aiff'
  404.   '.aiff' : 'audio/x-aiff'
  405.   '.au'  : 'audio/basic'
  406.   '.avi' : 'video/x-msvideo'
  407.   '.bat' : 'text/plain'
  408.   '.bcpio' : 'application/x-bcpio'
  409.   '.bin' : 'application/octet-stream'
  410.   '.bmp' : 'image/x-ms-bmp'
  411.   '.c'  : 'text/plain'
  412.   # Duplicates
  413.   '.cdf' : 'application/x-cdf'
  414.   '.cdf' : 'application/x-netcdf'
  415.   '.cpio' : 'application/x-cpio'
  416.   '.csh' : 'application/x-csh'
  417.   '.css' : 'text/css'
  418.   '.dll' : 'application/octet-stream'
  419.   '.doc' : 'application/msword'
  420.   '.dot' : 'application/msword'
  421.   '.dvi' : 'application/x-dvi'
  422.   '.eml' : 'message/rfc822'
  423.   '.eps' : 'application/postscript'
  424.   '.etx' : 'text/x-setext'
  425.   '.exe' : 'application/octet-stream'
  426.   '.gif' : 'image/gif'
  427.   '.gtar' : 'application/x-gtar'
  428.   '.h'  : 'text/plain'
  429.   '.hdf' : 'application/x-hdf'
  430.   '.htm' : 'text/html'
  431.   '.html' : 'text/html'
  432.   '.ico' : 'image/vnd.microsoft.icon'
  433.   '.ief' : 'image/ief'
  434.   '.jpe' : 'image/jpeg'
  435.   '.jpeg' : 'image/jpeg'
  436.   '.jpg' : 'image/jpeg'
  437.   '.js'  : 'application/javascript'
  438.   '.ksh' : 'text/plain'
  439.   '.latex' : 'application/x-latex'
  440.   '.m1v' : 'video/mpeg'
  441.   '.man' : 'application/x-troff-man'
  442.   '.me'  : 'application/x-troff-me'
  443.   '.mht' : 'message/rfc822'
  444.   '.mhtml' : 'message/rfc822'
  445.   '.mif' : 'application/x-mif'
  446.   '.mov' : 'video/quicktime'
  447.   '.movie' : 'video/x-sgi-movie'
  448.   '.mp2' : 'audio/mpeg'
  449.   '.mp3' : 'audio/mpeg'
  450.   '.mp4' : 'video/mp4'
  451.   '.mpa' : 'video/mpeg'
  452.   '.mpe' : 'video/mpeg'
  453.   '.mpeg' : 'video/mpeg'
  454.   '.mpg' : 'video/mpeg'
  455.   '.ms'  : 'application/x-troff-ms'
  456.   '.nc'  : 'application/x-netcdf'
  457.   '.nws' : 'message/rfc822'
  458.   '.o'  : 'application/octet-stream'
  459.   '.obj' : 'application/octet-stream'
  460.   '.oda' : 'application/oda'
  461.   '.p12' : 'application/x-pkcs12'
  462.   '.p7c' : 'application/pkcs7-mime'
  463.   '.pbm' : 'image/x-portable-bitmap'
  464.   '.pdf' : 'application/pdf'
  465.   '.pfx' : 'application/x-pkcs12'
  466.   '.pgm' : 'image/x-portable-graymap'
  467.   '.pl'  : 'text/plain'
  468.   '.png' : 'image/png'
  469.   '.pnm' : 'image/x-portable-anymap'
  470.   '.pot' : 'application/vnd.ms-powerpoint'
  471.   '.ppa' : 'application/vnd.ms-powerpoint'
  472.   '.ppm' : 'image/x-portable-pixmap'
  473.   '.pps' : 'application/vnd.ms-powerpoint'
  474.   '.ppt' : 'application/vnd.ms-powerpoint'
  475.   '.ps'  : 'application/postscript'
  476.   '.pwz' : 'application/vnd.ms-powerpoint'
  477.   '.py'  : 'text/x-python'
  478.   '.pyc' : 'application/x-python-code'
  479.   '.pyo' : 'application/x-python-code'
  480.   '.qt'  : 'video/quicktime'
  481.   '.ra'  : 'audio/x-pn-realaudio'
  482.   '.ram' : 'application/x-pn-realaudio'
  483.   '.ras' : 'image/x-cmu-raster'
  484.   '.rdf' : 'application/xml'
  485.   '.rgb' : 'image/x-rgb'
  486.   '.roff' : 'application/x-troff'
  487.   '.rtx' : 'text/richtext'
  488.   '.sgm' : 'text/x-sgml'
  489.   '.sgml' : 'text/x-sgml'
  490.   '.sh'  : 'application/x-sh'
  491.   '.shar' : 'application/x-shar'
  492.   '.snd' : 'audio/basic'
  493.   '.so'  : 'application/octet-stream'
  494.   '.src' : 'application/x-wais-source'
  495.   '.sv4cpio''application/x-sv4cpio'
  496.   '.sv4crc' : 'application/x-sv4crc'
  497.   '.swf' : 'application/x-shockwave-flash'
  498.   '.t'  : 'application/x-troff'
  499.   '.tar' : 'application/x-tar'
  500.   '.tcl' : 'application/x-tcl'
  501.   '.tex' : 'application/x-tex'
  502.   '.texi' : 'application/x-texinfo'
  503.   '.texinfo''application/x-texinfo'
  504.   '.tif' : 'image/tiff'
  505.   '.tiff' : 'image/tiff'
  506.   '.tr'  : 'application/x-troff'
  507.   '.tsv' : 'text/tab-separated-values'
  508.   '.txt' : 'text/plain'
  509.   '.ustar' : 'application/x-ustar'
  510.   '.vcf' : 'text/x-vcard'
  511.   '.wav' : 'audio/x-wav'
  512.   '.wiz' : 'application/msword'
  513.   '.wsdl' : 'application/xml'
  514.   '.xbm' : 'image/x-xbitmap'
  515.   '.xlb' : 'application/vnd.ms-excel'
  516.   # Duplicates
  517.   '.xls' : 'application/excel'
  518.   '.xls' : 'application/vnd.ms-excel'
  519.   '.xml' : 'text/xml'
  520.   '.xpdl' : 'application/xml'
  521.   '.xpm' : 'image/x-xpixmap'
  522.   '.xsl' : 'application/xml'
  523.   '.xwd' : 'image/x-xwindowdump'
  524.   '.zip' : 'application/zip'
  525.   } 
  526.   
  527.  # These are non-standard types, commonly found in the wild. They will 
  528.  # only match if strict=0 flag is given to the API methods. 
  529.   
  530.  # Please sort these too 
  531.  common_types = { 
  532.   '.jpg' : 'image/jpg'
  533.   '.mid' : 'audio/midi'
  534.   '.midi''audio/midi'
  535.   '.pct' : 'image/pict'
  536.   '.pic' : 'image/pict'
  537.   '.pict''image/pict'
  538.   '.rtf' : 'application/rtf'
  539.   '.xul' : 'text/xul' 
  540.   } 
  541.   
  542.   
  543. _default_mime_types() 
  544.   
  545.   
  546. if __name__ == '__main__'
  547.  import getopt 
  548.   
  549.  USAGE = """\ 
  550. Usage: mimetypes.py [options] type 
  551.   
  552. Options: 
  553.  --help / -h  -- print this message and exit 
  554.  --lenient / -l -- additionally search of some common, but non-standard 
  555.        types. 
  556.  --extension / -e -- guess extension instead of type 
  557.   
  558. More than one type argument may be given. 
  559. ""
  560.   
  561.  def usage(code, msg=''): 
  562.   print USAGE 
  563.   if msg: print msg 
  564.   sys.exit(code) 
  565.   
  566.  try
  567.   opts, args = getopt.getopt(sys.argv[1:], 'hle'
  568.          ['help''lenient''extension']) 
  569.  except getopt.error, msg: 
  570.   usage(1, msg) 
  571.   
  572.  strict = 1 
  573.  extension = 0 
  574.  for opt, arg in opts: 
  575.   if opt in ('-h''--help'): 
  576.    usage(0) 
  577.   elif opt in ('-l''--lenient'): 
  578.    strict = 0 
  579.   elif opt in ('-e''--extension'): 
  580.    extension = 1 
  581.  for gtype in args: 
  582.   if extension: 
  583.    guess = guess_extension(gtype, strict) 
  584.    if not guess: print "I don't know anything about type", gtype 
  585.    else: print guess 
  586.   else
  587.    guess, encoding = guess_type(gtype, strict) 
  588.    if not guess: print "I don't know anything about type", gtype 
  589.    else: print 'type:', guess, 'encoding:', encoding 
 

附上一篇关于python编码的帖子

1. pyhton的所有内置库、方法接受的是unicode编码的字符串。

2. str.decode 函数就是转成unicode编码,所以能decode的字符串传进python的内置库、函数都能正确运行。

3.问题在于这个decode函数解码时到底要传哪个参数:utf-8,gbk,gb2312......等N种编码。参数不当,就会抛类似异常:

 

复制代码 代码如下:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

 

   UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data

 

下面举个例子:

  1. #coding:utf-8 
  2. #指定本文件编码为utf8 
  3. import os 
  4. # 以下为示例代码,不一定能运行。随意写的,无编译运行过。 
  5. # 例子以XP平台为例,因为linux平台编码(UTF-8)与window平台(GBK)不一样。 
  6. # 假设D盘下面有很多中文名称文件 
  7. filelist = os.listdir(r"d:\\") # 此处返回的list中的中文是以GBK编码的,你可以通过查看cmd窗口属性看到。 
  8. for path in filelist: 
  9.  if os.path.isdir(path): continue 
  10.   fp = open(path.decode("GBK") , 'rb') # 如果此处用 path.decode("UTF-8") 就会抛异常,原因是wind的dir命令返回的是GBK编码  
  11.  print len(fp.read()) 
  12.   fp.close() 
  13. filepath =r"d:\\中文文件.doc"    # 假设此文存在,记得要带中文 
  14. fp = open(filepath.decode('utf-8'), "rb") #这里使用utf8参数进行解码,原因是文件头里有句coding: utf-8 
  15. print len(fp.read()) 
  16. fp.close() 
  17. path2 = u"d:\\中文文件.doc" # 假如这里有个u在前面,这个变量就是unicode编码了,不用解码。 
  18. fp = open(path2, 'rb'
  19. print len(fp.read()) 
  20. fp.close()