1

编辑- 如果有兴趣,请点击此处的最终开源代码。 https://github.com/qetennyson/ConfigFileBuilder

你好,这里的第一个问题。我对 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()

您正在考虑“应该可以正常工作”,并且确实如此,但有一个例外!

如果我不从 DAT 文件的开头删除“默认”(如图所示):

#The following line must not be removed.
Default
SSID1=MegaBoot_112D36
WebInit=1

...然后 ConfObj 将拒绝阅读它(我假设这是一个键/值问题)。

我实际上并没有在配置中没有“默认”的情况下测试过其中一个设备,但我倾向于听这条线告诉我不要删除它,我也不想真的让设备变砖。

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

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 个文件的基本文件中删除了它。我不知道为什么我认为我首先需要它,如果我只想在最后添加它!

再次感谢。

4

1 回答 1

0

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

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

以下代码将在文本文件的开头添加“默认”(也不是很好的代码,只是说明我的意思):

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)
于 2017-04-25T19:52:35.737 回答