簡體   English   中英

使用Python 2.7和ConfObj / Parser進行麻煩的DAT編輯

[英]Troublesome DAT editing with Python 2.7 and ConfObj/Parser

編輯 - 如果感興趣的話,這里有最終的開源代 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個文件的基本文件中刪除了它。 我不知道為什么我認為我首先需要它,如果我只是想把它添加到最后!

再次感謝。

這是一種智力上懶惰的解決方案,但似乎只需要對現有代碼進行最小的更改:

使用現有代碼創建沒有“默認”行的配置文件。 然后將該文件作為字符串讀回Python。 然后從文件中刪除所有內容,向其中添加“Default”行,然后回寫剛讀出的文件的所有其他內容。

下面的代碼將“Default”添加到文本文件的開頭(也不是很好的代碼,只是說明我的意思):

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM