想象一下,您有一个用于处理某种XML文件或配置文件的库.该库将整个文件读入内存并提供编辑内容的方法.完成操作内容后,可以调用a write将内容保存回文件.问题是如何以安全的方式做到这一点.
覆盖现有文件(开始写入原始文件)显然不安全.如果write方法在完成之前失败,则最终会得到一个半写文件并且您丢失了数据.
更好的选择是在某处写入临时文件,当write方法完成后,将临时文件复制到原始文件.
现在,如果副本以某种方式失败,您仍然可以在临时文件中正确保存数据.如果复制成功,您可以删除临时文件.
在POSIX系统上,我猜你可以使用rename系统调用,这是一个原子操作.但是你如何在Windows系统上做到最好?特别是,你如何使用Python处理这个问题?
另外,还有另一种安全写入文件的方案吗?
我想获得一个unicode版本calendar.month_abbr[6].如果我没有为语言环境指定编码,我不知道如何将字符串转换为unicode.下面的示例代码显示了我的问题:
>>> import locale
>>> import calendar
>>> locale.setlocale(locale.LC_ALL, ("ru_RU"))
'ru_RU'
>>> print repr(calendar.month_abbr[6])
'\xb8\xee\xdd'
>>> print repr(calendar.month_abbr[6].decode("utf8"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb8 in position 0: unexpected code byte
>>> locale.setlocale(locale.LC_ALL, ("ru_RU", "utf8"))
'ru_RU.UTF8'
>>> print repr(calendar.month_abbr[6])
'\xd0\x98\xd1\x8e\xd0\xbd'
>>> print repr(calendar.month_abbr[6].decode("utf8"))
u'\u0418\u044e\u043d'
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?解决方案不必看起来像这样.任何给我在unicode中缩写月份名称的解决方案都很好.
我正在为ConfigParserPython 编写一个包装器,以提供一个用于存储和检索应用程序设置的简单界面.
包装器有两种方法,read以及write一组用于不同应用程序设置的属性.
该write方法仅仅是用于一个包装ConfigParser的write与所述另外的也产生由所需的文件对象的方法ConfigParser.它看起来像这样:
def write(self):
f = open(self.path, "w")
try:
self.config_parser.write(f)
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
我想编写一个单元测试,声明如果无法写入该文件,则此方法会引发IOError,而在另一种情况下,会调用config解析器的write方法.
使用模拟对象很容易处理第二个测试.但这个open电话让事情变得有点棘手.最终我必须创建一个文件对象以传递给配置解析器.在运行此代码时实际创建文件这一事实并不能使它对单元测试非常有用.是否有一些模拟文件创建的策略?可以用某种方式测试这段代码吗?或者它是否太简单了?