чтение и запись в configparser - PullRequest
2 голосов
/ 30 июня 2011

Я использую 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?

Edit:

Следующее также возможно, но безопасно ли это?

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

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

Если вы действительно обеспокоены этим, вы можете записать во временный файл, а затем переименовать временный файл в этот - в случае сбоя записи конфигурации исходный файл не будет затронут; переименование / перемещение обычно атомарное (хотя в 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')
0 голосов
/ 08 декабря 2018

Это то, что я бы сделал, столкнувшись с похожим сценарием.

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.

...