2015-10-19 26 views
0

我有一個私鑰文件(private.key)與內容的格式如下如何從python文件中提取必要的內容?

-----BEGIN PRIVATE KEY----- 
blahblahblahblahblahblahblahblah 
blahblahblahblahblahblahblahblah 
blahblahblahblahblahblahblahblah 
-----END PRIVATE KEY----- 

我讀的文件如下:

pk = open('private.key', 'rb').read() 

如何消除第一行和最後並只提取私鑰的內容到變量pk中?

期待在Python類似的東西

egrep -v "PRIVATE KEY" private.key | tr -d "\n\r" 
+1

沒有必要爲二進制讀模式''b''爲您的關鍵是base64編碼。在解決了上述問題後,此模塊將派上用場:https://docs.python.org/3.4/library/base64.html#module-base64。這也許有所幫助:https://python-gnupg.readthedocs.org/en/latest/gnupg.html –

回答

1

可以使用

pk = open('file.txt', 'r').readlines() #or 'rb' if there's a need 

if len(pk) > 2: 
    for line in pk[1:-1]: 
     print line, 
     #or do anything you like to do with line 

,以避免第一和最後一行的處理行列表中

+0

你爲什麼使用'rb'模式? –

+0

因爲作者正在使用它 - 當然它可能只是r –

+1

爲什麼-2在這個上?我檢查過它,它的工作原理 - 爲什麼不是這樣做的好方法?事實是,我沒有指出** readlines **是必要的,而不是** read ** int「第一個版本」 –

0
with open('private.key', 'r') as infile: 
    pk = infile.read().split('\n', 1)[1].rsplit('\n', 1)[0] 
+0

這不起作用。打印pk現在只打印第一行。而要求是pk應該包含除BEGIN和END行之外的全部關鍵內容。 – KurinchiMalar

+0

@KurinchiMalar:哎呀!對不起,在那裏忘了一個可選的論點。檢查編輯 – inspectorG4dget

+0

仍然有問題。現在我正在獲得所需的內容+ ----- END PRIVATE KEY ----- – KurinchiMalar

3
with open('private.key', 'r') as f: # use with here, it will auto close the file. 
    pk = f.readlines() 

pk = pk[1:-1] 

現在,pk是按行保存私鑰的列表。
要打印出來,你可以只使用print()這樣的:

for i in pk: 
    print(pk) 

或者,像egrep作用:

with open('private.key', 'r') as f: # use with here, it will auto close the file. 
    pk = f.read() 

for i in pk: 
    if 'PRIVATE' not in i: 
     print(i) 
1

對於更廣泛的解決方案,使意見的文件中(任何在BEGIN PRIVATE KEYEND PRIVATE KEY之外),並且還處理一個文件中的多個私鑰(但是,如果這就是你找到的第一個,就讓你停止閱讀螞蟻),你可以在一臺發電機用一個很簡單的狀態機的算法:

def private_keys(file): 
    key = [] 
    inside_guards = False 
    for line in file: 
     if line == "-----BEGIN PRIVATE KEY-----": 
      inside_guards = True 
      continue 
     if line == "-----END PRIVATE KEY-----": 
      inside_guards = False 
      yield data 
      data = [] 
      continue 

     if inside_guards: 
      data.append(line) 
+0

嗯,我認爲這太複雜了。 –