我确信这是一个相当菜鸟的问题,我已经在 Google 上搜索过了,却找不到直接的答案,但我可能问错了……我正在尝试制作一个开箱即用的配置脚本,所有需要回答的问题都存储在一个名为 pass.ini 的文件中。当我从 getstr(使用 curses)获取用户输入时,当它填充我的文件时,它们都以 b'variable string' 作为其值。当我尝试执行 strip 命令时,我得到 b'riable strin'。当我执行 str(variable) 时,它会出现同样的问题。我看到 b'<variable_string>' 可以表示它是字节码而不是解码的。因此我尝试了解码命令,但失败了,因为“str 对象没有属性‘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''
答案1
虽然这是一个编程问题,但 b'' 表示以字节为单位。与 Python 2 相比有很大变化。
str 对应于 Python 2 上的前 unicode 类型。它在内部表示为 Unicode 代码点序列。您可以声明 str 变量而不在字符串前面添加 u,因为它现在是默认的。
bytes 大致对应于 Python 2 上的前 str 类型(对于字节部分)。它是一种二进制序列化格式,由 8 位整数序列表示,适合在文件系统上存储数据或通过互联网发送数据。这就是为什么您只能创建包含 ASCII 文字字符的字节。要定义字节变量,只需将 ab 添加到字符串前面。