configparser 读写

发布于 2024-11-17 17:05:25 字数 648 浏览 6 评论 0原文

我正在使用 Python 3.2 和 configparser 模块,并遇到了一些问题。我需要读取配置文件,然后写入配置文件。我尝试了以下操作:

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
a.write(data)

问题是,当我使用 r+ 打开数据时,当我写入数据时,会附加新信息;它不会覆盖旧的。

import configparser
data = open('data.txt', 'r')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
data = open('data.txt', 'w')
a.write(data)

这种方式 ^ 似乎不安全,因为用 w 打开它会清空文件。如果程序在还没来得及写入之前就崩溃了怎么办?配置文件丢失。用 w 打开之前备份是唯一的解决方案吗?

编辑:

以下也是一种可能性,但是安全吗?

a.write(open('data.txt','w'))

I'm using Python 3.2 and the configparser module, and running into some problems. I need to read, then write to a config file. I tried the following:

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
a.write(data)

The problem is that when I open data with r+, when I write to it the new information gets appended; it does not overwrite the old.

import configparser
data = open('data.txt', 'r')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
data = open('data.txt', 'w')
a.write(data)

This way ^ seems unsafe, because opening it with w empties the file. What if the program crashes before it has time to write? The configuration file is lost. Is the only solution to backup before opening with w?

Edit:

The following is also a possibility, but is it safe?

a.write(open('data.txt','w'))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

聚集的泪 2024-11-24 17:05:25

如果你真的担心这一点,你可以写入一个临时文件,然后将临时文件重命名为这个文件——如果配置写入失败,原始文件将保持不变;重命名/移动通常是原子的(尽管在 Windows 下您可能需要直接调用 MoveFileEx,而不是使用 os.rename),因此您可以确定您会具有旧内容或新内容,并且文件不会处于任何其他状态(当然,没有底层文件系统的任何严重故障)。

# ...
a['example']['test'] = 'red'

import tempfile, os
with tempfile.NamedTemporaryFile() as tmp:
    a.write(tmp)

    # or ctypes.windll.kernel32.MoveFileExW(tmp.name, 'data.txt', 2)
    # 2 = MOVEFILE_REPLACE_EXISTING 
    # I'll leave wrapping it in a cross-platform manner up to you
    os.rename(tmp.name, 'data.txt')

If you're really concerned about that, you can write to a temporary file, and then rename the temporary file to this one — if the config write fails, the original will be untouched; rename/move is usually atomic (though under Windows you might need to call MoveFileEx directly, instead of using os.rename), so you can be sure that you'll either have the old contents or the new contents, and the file won't be in any other state (sans any critical failures of the underlying filesystem, of course).

# ...
a['example']['test'] = 'red'

import tempfile, os
with tempfile.NamedTemporaryFile() as tmp:
    a.write(tmp)

    # or ctypes.windll.kernel32.MoveFileExW(tmp.name, 'data.txt', 2)
    # 2 = MOVEFILE_REPLACE_EXISTING 
    # I'll leave wrapping it in a cross-platform manner up to you
    os.rename(tmp.name, 'data.txt')
一紙繁鸢 2024-11-24 17:05:25

当我遇到类似的情况时,这就是我会做的。

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
data.truncate(0)#<--
data.seek(0)#<--
a.write(data)

这会导致文件对象被截断为零。然后它将指针重置为文件的开头。之后,configparser 可以像正常情况一样处理空文件对象。

应该注意的是,我是在 Python 3 中这样做的。

This is what I would do as I ran into a similar scenario.

import configparser
data = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(data)
a['example']['test'] = 'red'
data.truncate(0)#<--
data.seek(0)#<--
a.write(data)

This causes the file object to get truncated to zero. Then it resets the pointer to the beginning of the file. After that configparser can proceed like normal with an empty file object.

It should be noted that I did this in Python 3.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文