使用 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()
你在想 "that should work fine" 确实如此,只有一个例外!
如果我不删除 DAT 文件开头的 "Default"(此处显示):
#The following line must not be removed.
Default
SSID1=MegaBoot_112D36
WebInit=1
...然后 ConfObj 将拒绝阅读它(我假设这是一个 key/value 问题)。
如果配置中没有 "Default",我还没有真正测试过这些设备中的一个,但我倾向于听那条线告诉我不要删除它,我不想真的把设备变砖了。
作为初学者,我做了更多研究,意识到我可以通过编程方式删除默认值,然后在完成 ConfObj 工作后将其添加回去,但我想在这里签到第一的。另外,我能够很容易地得到 "Default":
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()
...但我不确定如何将它塞回那里。
这整件事我都可以用鞋拔!
请赐教
问题解决了!感谢您对 Sweater-Baron 的反馈。
这是我的最终代码,可能需要进行一些重构,但我会讲到的。我终于有了一个功能齐全的配置生成器!
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]
我意识到我被挂断的一件事是 "Default" 的初始删除。相反,我只是从配置 90 个文件的基本文件中删除了它。我不确定为什么我认为我首先需要它,如果我只是想在最后添加它!
再次感谢。
这是一种懒惰的解决方案,但似乎只需要对现有代码进行最少的更改:
使用您现有的代码创建一个没有 "Default" 行的配置文件。然后将该文件作为字符串读回 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)
编辑 - 如果有兴趣,请在此处最终打开源代码。 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()
你在想 "that should work fine" 确实如此,只有一个例外!
如果我不删除 DAT 文件开头的 "Default"(此处显示):
#The following line must not be removed.
Default
SSID1=MegaBoot_112D36
WebInit=1
...然后 ConfObj 将拒绝阅读它(我假设这是一个 key/value 问题)。
如果配置中没有 "Default",我还没有真正测试过这些设备中的一个,但我倾向于听那条线告诉我不要删除它,我不想真的把设备变砖了。
作为初学者,我做了更多研究,意识到我可以通过编程方式删除默认值,然后在完成 ConfObj 工作后将其添加回去,但我想在这里签到第一的。另外,我能够很容易地得到 "Default":
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()
...但我不确定如何将它塞回那里。
这整件事我都可以用鞋拔!
请赐教
问题解决了!感谢您对 Sweater-Baron 的反馈。
这是我的最终代码,可能需要进行一些重构,但我会讲到的。我终于有了一个功能齐全的配置生成器!
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]
我意识到我被挂断的一件事是 "Default" 的初始删除。相反,我只是从配置 90 个文件的基本文件中删除了它。我不确定为什么我认为我首先需要它,如果我只是想在最后添加它!
再次感谢。
这是一种懒惰的解决方案,但似乎只需要对现有代码进行最少的更改:
使用您现有的代码创建一个没有 "Default" 行的配置文件。然后将该文件作为字符串读回 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)