2015-10-19 93 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

嗯,我认为这太复杂了。 –