使用Python2.7和ConfObj/Parser进行麻烦的DAT编辑

使用Python2.7和ConfObj/Parser进行麻烦的DAT编辑,python,ini,configparser,configobj,Python,Ini,Configparser,Configobj,编辑-如果感兴趣,请在此编辑最终的开放源代码 你好,第一个问题。我对Python比较陌生(这里使用的是2.7),并且一直是一个相当普通的程序员 我正在编写一个简短的程序,为这些专有的、连接互联网的电源开关构建配置文件,我有大约90个。每个城市都需要一个独特的配置 我对文件类型知之甚少,但这些家伙都是DAT,我认为它们与INI非常相似,足以让我在六到七个小时、几年、几代的时间里用头敲击键盘 这是我现有的代码 from configobj import ConfigObj import csv im

编辑-如果感兴趣,请在此编辑最终的开放源代码

你好,第一个问题。我对Python比较陌生(这里使用的是2.7),并且一直是一个相当普通的程序员

我正在编写一个简短的程序,为这些专有的、连接互联网的电源开关构建配置文件,我有大约90个。每个城市都需要一个独特的配置

我对文件类型知之甚少,但这些家伙都是DAT,我认为它们与INI非常相似,足以让我在六到七个小时、几年、几代的时间里用头敲击键盘

这是我现有的代码

from configobj import ConfigObj
import csv
import os

config = ConfigObj('configtest3.dat', list_values=True, raise_errors=False)

with open('config.csv') as csvfile:
    csvreader = csv.reader(csvfile, dialect='excel')
    office = 'null'
    while (office != 'LASTOFFICEINLIST'):
        for row in csvreader:
            config.filename = row[0] + '-powerswitch'
            config['Hostname'] = row[0]
            config['Ipaddr'] = row[2]
            config['OutletName1'] = row[3]
            config['Gateway'] = row[4]
            config['DNS'] = 'DNSTEST'
            config['Account1'] = row[6]
            config['Password1'] = 'passwordtest'
            config['TimeServer1'] = 'x.x.x.x' <--Sanitized
            config['TimeZone'] = '800'
            office = row[0]
            config.write()
…然后ConfObj将拒绝阅读(我假设这是一个关键/价值问题)

在配置中没有“默认值”的情况下,我没有实际测试过这些设备中的一个,但我倾向于听台词告诉我不要删除它,我也不想真正地用砖块填充设备

在我的初学者阶段,我做了更多的研究,并意识到我可以做的是以编程方式删除默认值,然后在完成ConfBj工作后将其添加回,但我想先在这里签入。另外,我可以很容易地得到“默认值”:

with open ('configtest3.dat', 'r+') as f:
    config = f.readlines()
    f.seek(0)
    for i in config:
        if i != 'Default\n':
            f.write(i)
        f.truncate()
…但我不知道如何把它塞回那里

这整件事都是我干的

请开导我


问题解决了!感谢您的反馈,男爵

这是我的最后一段代码,可能需要进行一些重构,但我会继续讲下去。我终于有了一个功能齐全的配置生成器

from configobj import ConfigObj
import csv
import os

config = ConfigObj('configtest.dat', list_values=True, raise_errors=False)

with open('config.csv') as csvfile:
    configcsv = csv.reader(csvfile, dialect='excel')
    office = 'null'
    while (office != 'Wooster'):
        for row in configcsv:
            config.filename = row[0] + '-powerswitch.dat'
            config['Hostname'] = row[0]
            config['Ipaddr'] = row[2]
            config['OutletName1'] = row[3]
            config['Gateway'] = row[4]
            config['DNS'] = 'DNSTEST'
            config['Account1'] = row[6]
            config['Password1'] = 'passwordtest'
            config['TimeServer1'] = '10.116.65.17'
            config['TimeZone'] = '800'
            office = row[0]
            config.write()

with open('config.csv') as csvfile:
    configcsv = csv.reader(csvfile, dialect='excel')
    csvfile.seek(0)
    office = 'null'
    while (office != 'Wooster'):
        for row in configcsv:
            filename = row[0] + '-powerswitch.dat'
            with open(filename, 'r') as cfgFile:
                almostCorrect = cfgFile.read()
            correct = "#The following line must not be removed.\nDefault\n" + almostCorrect
            with open(filename, 'w') as cfgFile:
                cfgFile.write(correct)
            print row[0]
            office = row[0]
我意识到有一件事让我很困扰,那就是最初删除了“默认”。相反,我只是从配置90个文件的基础文件中删除了它。我不知道为什么我认为我需要在那里放在第一位,如果我只是想在最后添加回来


再次感谢。

这是一种智力懒惰的解决方案,但它似乎需要对现有代码进行最小的更改:

使用现有代码创建不带“Default”行的配置文件。然后将该文件作为字符串读回Python。然后删除文件中的所有内容,添加“默认”行,然后写回刚从中读取的文件的所有其他内容

下面的代码将在文本文件的开头添加“Default”(也不是很好的代码,只是演示一下我的意思):


这是一种智力懒惰的解决方案,但它似乎需要对现有代码进行最小的更改:

使用现有代码创建不带“Default”行的配置文件。然后将该文件作为字符串读回Python。然后删除文件中的所有内容,添加“默认”行,然后写回刚从中读取的文件的所有其他内容

下面的代码将在文本文件的开头添加“Default”(也不是很好的代码,只是演示一下我的意思):


欢迎来到StackOverflow-很好的第一个问题。谢谢@Zze,很高兴来到这里提问!欢迎来到StackOverflow-很好的第一个问题。谢谢@Zze,很高兴来到这里提问!谢谢你,毛衣男爵。我在把它作为一个字符串传递的过程中遇到了一些运气不好的情况,但看起来这显然应该奏效。我会花更多的时间修补它。当您说“创建一个没有默认值的配置文件”时,我将其解释为使用ConfigObj模块创建配置文件。这是对的吗?我意识到我误解了你的评论,我想出于历史目的把我的评论留在那里。我将保留现有的内容,将文件作为字符串发送回Python,在其中弹出默认值(我想这将花费我一点时间,我听说除了append()很难),然后继续!是的,我的意思是使用ConfigObj写入“Default less”配置文件,然后将整个文件作为字符串读回Python,然后用“Default\n”+configStringI覆盖它。我在回答中添加了一些示例代码,在文本文件前面加上“Default”谢谢@worter Baron。我在把它作为一个字符串传递的过程中遇到了一些运气不好的情况,但看起来这显然应该奏效。我会花更多的时间修补它。当您说“创建一个没有默认值的配置文件”时,我将其解释为使用ConfigObj模块创建配置文件。这是对的吗?我意识到我误解了你的评论,我想出于历史目的把我的评论留在那里。我将保留现有的内容,将文件作为字符串发送回Python,在其中弹出默认值(我想这将花费我一点时间,我听说除了append()很难),然后继续!是的,我是说使用ConfigObj写入“Default less”配置文件,然后将整个文件作为字符串读回Python,然后用“Default\n”+configStringI覆盖它。我在回答中添加了一些示例代码,在文本文件前面加上“Default”
from configobj import ConfigObj
import csv
import os

config = ConfigObj('configtest.dat', list_values=True, raise_errors=False)

with open('config.csv') as csvfile:
    configcsv = csv.reader(csvfile, dialect='excel')
    office = 'null'
    while (office != 'Wooster'):
        for row in configcsv:
            config.filename = row[0] + '-powerswitch.dat'
            config['Hostname'] = row[0]
            config['Ipaddr'] = row[2]
            config['OutletName1'] = row[3]
            config['Gateway'] = row[4]
            config['DNS'] = 'DNSTEST'
            config['Account1'] = row[6]
            config['Password1'] = 'passwordtest'
            config['TimeServer1'] = '10.116.65.17'
            config['TimeZone'] = '800'
            office = row[0]
            config.write()

with open('config.csv') as csvfile:
    configcsv = csv.reader(csvfile, dialect='excel')
    csvfile.seek(0)
    office = 'null'
    while (office != 'Wooster'):
        for row in configcsv:
            filename = row[0] + '-powerswitch.dat'
            with open(filename, 'r') as cfgFile:
                almostCorrect = cfgFile.read()
            correct = "#The following line must not be removed.\nDefault\n" + almostCorrect
            with open(filename, 'w') as cfgFile:
                cfgFile.write(correct)
            print row[0]
            office = row[0]
with open("ConfigFilePath", "r") as cfgFile:
    almostCorrect = cfgFile.read()
correct = "Default\n" + almostCorrect
# Overwrite the original file with our new string which has "Default" at the beginning:
with open("ConfigFilePath", "w") as cfgFile:
    cfgFile.write(correct)