我确信这是一个相当菜鸟的问题,我用谷歌搜索过,找不到直接的答案,但我可能问错了……我正在尝试制作一个开箱即用的配置脚本,以及所有需要的问题回答存储在一个名为 pass.ini 的文件中。当我在填充我的文件时从getstr(使用curses)获取用户输入时,它们都有b'variable string'作为它们的值。当我尝试执行剥离命令时,我得到 b'riable strin'。当我做一个 str(variable) 时,它会遇到同样的问题。我看到 b'<variable_string>' 可以表示它是字节码而不是解码的标志。所以我尝试了一个解码命令,但失败了,因为'str object has no attribute'decode'我让它通过ConfigParser写出来,并作为file.write写到一个单独的文件中。现在一切都被注释掉了,
这是信息收集模块:
wrapper(CommitChanges)
curses.echo()
stdscr.addstr( 8, 19, config.CIP , curses.color_pair(3) )
config.CIP = stdscr.getstr( 8, 19, 15)
stdscr.addstr( 9, 19, config.CSM , curses.color_pair(3) )
config.CSM = stdscr.getstr( 9, 19, 15)
stdscr.addstr( 10, 19, config.CGW , curses.color_pair(3) )
config.CGW = stdscr.getstr(10, 19, 15)
stdscr.addstr( 11, 19, config.CD1 , curses.color_pair(3) )
config.CD1 = stdscr.getstr(11, 19, 15)
stdscr.addstr( 12, 19, config.CD2 , curses.color_pair(3) )
config.CD2 = stdscr.getstr(12, 19, 15)
stdscr.addstr( 13, 19, config.CNTP, curses.color_pair(3) )
config.CNTP = stdscr.getstr(13, 19, 15)
stdscr.addstr( 16, 19, config.CHN , curses.color_pair(3) )
config.CHN = stdscr.getstr(16, 19, 15)
stdscr.addstr( 14, 19, config.CID , curses.color_pair(3) )
config.CID = stdscr.getstr(14, 19, 15)
stdscr.addstr( 15, 19, config.CS , curses.color_pair(3) )
config.CS = stdscr.getstr(15, 19, 15)
这是文件输出模块
def CommitChanges():
MOP = "X"
Config['Array=all']['PTLIP'] = a
Config['Array=all']['PTLSM'] = config.CSM.decode('utf-8')
Config['Array=all']['PTLGW'] = config.CGW.decode('utf-8')
Config['Array=all']['PTLD1'] = config.CD1.decode('utf-8')
Config['Array=all']['PTLD2'] = config.CD2.decode('utf-8')
Config['Array=all']['PTLNTP'] = config.CNTP.decode('utf-8')
Config['Array=all']['PTLIF'] = config.CIFN.decode('utf-8')
Config['Array=all']['PTLHSTNM'] = config.CHN.decode('utf-8')
Config['Array=all']['PTLMOB'] = config.CMOB.decode('utf-8')
Config['Array=all']['customerid'] = config.CID.decode('utf-8')
Config['Array=all']['site'] = config.CS.decode('utf-8')
with open('/opt/passp/pass.ini', 'w') as passini:
Config.write(passini, space_around_delimiters=False)
tpass= open('./pass.b', 'w')
tpass.write("[Array=All]"+ "\n")
tpass.write("ptlip="+ a + "\n")
tpass.write("ptlsm="+ config.CSM.decode('utf-8') +"\n")
tpass.write("ptlgw="+ config.CGW.decode('utf-8') + "\n")
tpass.write("ptld1="+ config.CD1.decode('utf-8') + "\n")
tpass.write("ptld2="+ config.CD2.decode('utf-8') + "\n")
tpass.write("ptlntp="+ config.CNTPdecode('utf-8') + "\n")
tpass.write("ptlif="+ config.CIFNdecode('utf-8') + "\n")
tpass.write("ptldhstnm="+ config.CHNdecode('utf-8') + "\n")
tpass.write("ptlmob="+ config.CMOBdecode('utf-8') + "\n")
tpass.write("customerid="+ config.CIDdecode('utf-8') + "\n")
tpass.write("site="+ config.CSdecode('utf-8') + "\n")
#if Backupfiles():
textchanges()
return
这是 ConfigParser 创建的文件保存输出
[Array=all]
ptlip=b'123'
ptlsm=b'321'
ptlgw=b'111'
ptld1=b'222'
ptld2=b'333'
ptlntp=b'444'
ptlif=s19
ptlhstnm=b'555'
ptlmob=
customerid=b'666'
site=b'777'
当我进行直接写入时它完全匹配(它们来自两次不同的运行,但即使有空数据它也有包装器。
有趣的是,'ptlif' 是通过查找接口名称收集的,它不是由用户输入处理的,因此它必须是 config.XXXX 变量的存储方式。
[Array=All]
ptlip=b''
ptlsm=b''
ptlgw=b''
ptld1=b''
ptld2=b''
ptlntp=b''
ptlif=s19
ptldhstnm=b''
ptlmob=
customerid=b''
site=b''
虽然这是一个编程问题,但 b'' 表示它以字节为单位。与 python 2 相比有很大的变化。
str 对应于 Python 2 上的前 unicode 类型。它在内部表示为 Unicode 代码点序列。您可以声明一个 str 变量,而无需在字符串前面加上 u,因为它现在是默认值。
bytes 大致对应于 Python 2 上的前 str 类型(用于 bytes 部分)。它是一种二进制序列化格式,由 8 位整数序列表示,适用于在文件系统上存储数据或通过 Internet 发送数据。这就是为什么您只能创建包含 ASCII 文字字符的字节。要定义字节变量,只需将 ab 添加到字符串。