Linux

Python 3 中 b’ ’ 中涵蓋的變數

  • September 22, 2020

我確信這是一個相當菜鳥的問題,我用Google搜尋過,找不到直接的答案,但我可能問錯了……我正在嘗試製作一個開箱即用的配置腳本,以及所有需要的問題回答儲存在一個名為 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 添加到字元串。

引用自:https://serverfault.com/questions/1034796