我创建了一个名为Options的类。它可以正常工作,但不适用于Python2。我希望它在Python 2和3上都能工作。已确定问题:FileNotFoundError在Python 2中不存在。但是,如果我使用IOError,它在Python 3中不起作用
在版本3.3中进行了更改:EnvironmentError,IOError,WindowsError,VMSError,socket.error,select.error和mmap.error已合并到OSError中。
我该怎么办?(有原因请不要讨论我对便携性的选择。)
这是代码:
#!/usr/bin/python #-*-coding:utf-8* #option_controller.py #Walle Cyril #25/01/2014 import json import os class Options(): """Options is a class designed to read, add and change informations in a JSON file with a dictionnary in it. The entire object works even if the file is missing since it re-creates it. If present it must respect the JSON format: e.g. keys must be strings and so on. If something corrupted the file, just destroy the file or call read_file method to remake it.""" def __init__(self,directory_name="Cache",file_name="options.json",imported_default_values=None): #json file self.option_file_path=os.path.join(directory_name,file_name) self.directory_name=directory_name self.file_name=file_name #self.parameters_json_file={'sort_keys':True, 'indent':4, 'separators':(',',':')} #the default data if imported_default_values is None: DEFAULT_INDENT = 2 self.default_values={\ "translate_html_level": 1,\ "indent_size":DEFAULT_INDENT,\ "document_title":"Titre"} else: self.default_values=imported_default_values def read_file(self,read_this_key_only=False): """returns the value for the given key or a dictionary if the key is not given. returns None if it s impossible""" try: text_in_file=open(self.option_file_path,'r').read() except FileNotFoundError:#not 2.X compatible text_in_file=""#if the file is not there we re-make one with default values if text_in_file=="":#same if the file is empty self.__insert_all_default_values() text_in_file=open(self.option_file_path,'r').read() try: option_dict=json.loads(text_in_file) except ValueError: #if the json file is broken we re-make one with default values self.__insert_all_default_values() text_in_file=open(self.option_file_path,'r').read() option_dict=json.loads(text_in_file) if read_this_key_only: if read_this_key_only in option_dict: return option_dict[read_this_key_only]# else: #if the value is not there it should be written for the next time if read_this_key_only in self.default_values: self.add_option_to_file(read_this_key_only,self.default_values[read_this_key_only]) return self.default_values[read_this_key_only] else: #impossible because there is not default value so the value isn t meant to be here return None else: return option_dict def add_option_to_file(self,key,value):#or update """Adds or updates an option(key and value) to the json file if the option exists in the default_values of the object.""" option_dict=self.read_file() if key in self.default_values: option_dict[key]=value open(self.option_file_path,'w').write(\ json.dumps(option_dict,sort_keys=True, indent=4, separators=(',',':'))) def __insert_all_default_values(self): """Recreate json file with default values. called if the document is empty or non-existing or corrupted.""" try: open(self.option_file_path,'w').write(\ json.dumps(self.default_values,sort_keys=True, indent=4, separators=(',',':'))) except FileNotFoundError: os.mkdir(self.directory_name)#Create the directory if os.path.isdir(self.directory_name):#succes self.__insert_all_default_values() else: print("Impossible to write in %s and file %s not found" % (os.getcwd(),self.option_file_path)) #demo if __name__ == '__main__': option_file_object=Options() print(option_file_object.__doc__) print(option_file_object.read_file()) option_file_object.add_option_to_file("","test")#this should have no effect option_file_object.add_option_to_file("translate_html_level","0")#this should have an effect print("value of translate_html_level:",option_file_object.read_file("translate_html_level")) print(option_file_object.read_file())
您可以使用基类异常EnvironmentError并使用’errno’属性来确定引发了哪个异常:
from __future__ import print_function import os import errno try: open('no file of this name') # generate 'file not found error' except EnvironmentError as e: # OSError or IOError... print(os.strerror(e.errno))
或者只是以相同的方式使用IOError:
try: open('/Users/test/Documents/test') # will be a permission error except IOError as e: print(os.strerror(e.errno))
适用于Python 2或Python 3。
注意不要直接与数字值进行比较,因为它们在不同平台上可能会有所不同。相反,请在Python的标准库errno模块中使用命名的常量,该常量将为运行时平台使用正确的值。
errno