Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将文件转换为二进制代码_Python_Python 3.x_Encoding_Binary_Base64 - Fatal编程技术网

在Python中将文件转换为二进制代码

在Python中将文件转换为二进制代码,python,python-3.x,encoding,binary,base64,Python,Python 3.x,Encoding,Binary,Base64,我希望为一个项目将一个文件转换为二进制文件,最好使用Python,因为我对它最熟悉,不过如果仔细阅读,我可能会使用另一种语言 基本上,我在一个项目中需要这个,我们希望使用DNA链存储数据,因此需要以二进制形式存储文件(“a”和“

我希望为一个项目将一个文件转换为二进制文件,最好使用Python,因为我对它最熟悉,不过如果仔细阅读,我可能会使用另一种语言

基本上,我在一个项目中需要这个,我们希望使用DNA链存储数据,因此需要以二进制形式存储文件(“
a
”和“
<0
”、“
G
=1

你知道我该怎么做吗?我确实发现use可以在base64中编码,然后解码,但似乎效率有点低,而且我的代码似乎不起作用

import base64
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
print(file_path)
with open(file_path) as f:
    encoded = base64.b64encode(f.readlines())
    print(encoded)
另外,我已经有了一个程序,可以简单地通过文本来实现这一点。任何关于如何改进它的提示都将不胜感激

import binascii
t = bytearray(str(input("Texte?")), 'utf8')
h = binascii.hexlify(t)
b = bin(int(h, 16)).replace('b','') 
#removing the b that appears in the end for some reason
g = b.replace('1','G').replace('0','A')
print(g)
例如,如果输入测试: 好的,那么对于DNA的文本: 我输入'test'并期望来自二进制的DNA序列 二进制代码是:0111010100111001110100(我还要求打印示例中的每个转换,以便更容易理解)


当然,这是低效的
base64
设计用于在文本中存储二进制文件。转换后会产生更大的块。

顺便问一下:你想要什么样的效率?紧凑性

如果是:第二个样本更接近您想要的

顺便说一句:在您的任务中,您会丢失信息!你知道吗

下面是一个如何存储和恢复的示例

它以易于理解的
十六进制文本格式存储数据
只是为了演示。如果您想要紧凑-您可以轻松地修改代码以存储在二进制文件中,或者如果您想要
00011001
view-修改也将很容易

import math
#"make a long test string"
import numpy as np
s=''.join((str(x) for x in np.random.randint(4,size=33)))\
    .replace('0','A').replace('1','T').replace('2','G').replace('3','C')

def store_(s):
    size=len(s) #size will changed to fit 8*integer so remember true value of it and store with data
    s2=s.replace('A','0').replace('T','0').replace('G','1').replace('C','1')\
        .ljust( int(math.ceil(size/8.)*8),'0') #add '0' to 8xInt to the right
    a=(hex( eval('0b'+s2[i*8:i*8+8]) )[2:].rjust(2,'0') for i in xrange(len(s2)/8))
    return ''.join(a),size

yourDataAsHexInText,sizeToStore=store_(s)
print yourDataAsHexInText,sizeToStore


def restore_(s,size=None):
    if size==None: size=len(s)/2
    a=( bin(eval('0x'+s[i*2:i*2+2]))[2:].rjust(8,'0') for i in xrange(len(s)/2))
    #you loose information, remember?, so it`s only A or G
    return (''.join(a).replace('1','G').replace('0','A') )[:size]

restore_(yourDataAsHexInText,sizeToStore)


print "so check it"
print s ,"(input)"
print store_(s)
print s.replace('C','G').replace('T','A') ,"to compare with information loss"
print restore_(*store_(s)),"restored"
print s.replace('C','G').replace('T','A') == restore_(*store_(s))
我的测试结果:

63c9308a00 33
so check it
AGCAATGCCGATGTTCATCGTATACTTTGACTA (input)
('63c9308a00', 33)
AGGAAAGGGGAAGAAGAAGGAAAAGAAAGAGAA to compare with information loss
AGGAAAGGGGAAGAAGAAGGAAAAGAAAGAGAA restored
True

所以,多亏了@jornshape和Sergey Vturin,我终于实现了我想要的! 我的程序要求输入一个文件,将其转换成二进制,然后使用成对的二进制数(00=a,01=T,10=G,11=C)将其等效为“DNA代码”


如果你从四个字符变成两个字符,你是否不可避免地会丢失信息?你怎么能把它拿回来?你的意思是因为我们用A和T来表示0,用G和C来表示1?好吧,因为开始的信息是二进制的,我看不出这会使我们丢失信息(我可能解释得不好…),我肯定不会。你能给出一个例子,包括输入样本、预期和实际输出吗?你这个甜甜圈!非常感谢你的回答!但是我有点迷路了,你能再解释一下你的代码吗?这里的输入应该是什么?因为你似乎只想输入A,T,G和C,我不太明白,但是是的-这个样本等待一个字符串“A,T,G和C”,如果你想像样本中那样将其二进制化为dna,那么你只能使用修改后的还原(只需修改为bin而不是hex)解释:存储将输入字符串拆分为8个组,将每个组解释为二进制整数值并存储在中(十六进制,但可以以任何格式存储)。restore_uu将evert 2符号片段解释为整数(在这里您可以更改为任何您想要的格式),并将其转换回。噢。简而言之,我想把一个文件或文本转换成DNA。就像在这个例子中,我输入'test',它返回DNA中的'equired'。这就是我想要的文件。因此,我需要将文件转换为二进制文件,以便能够将其转换为DNAit在我看来毫无意义的文件,但这很容易。如果将输入字符串的每个字符视为二进制。s=“test”(“”.join((bin(ord(x))[2:].rjust(8,'0')表示s中的x)).replace('1','G').replace('0','A'))//您可以在示例中使用隔离的或类似的内容-它是在还原的第二个字符串中修改的_
63c9308a00 33
so check it
AGCAATGCCGATGTTCATCGTATACTTTGACTA (input)
('63c9308a00', 33)
AGGAAAGGGGAAGAAGAAGGAAAAGAAAGAGAA to compare with information loss
AGGAAAGGGGAAGAAGAAGGAAAAGAAAGAGAA restored
True
import binascii
from tkinter import filedialog

file_path = filedialog.askopenfilename()

x = ""
with open(file_path, 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        x += str(binascii.hexlify(chunk)).replace("b","").replace("'","")
b = bin(int(x, 16)).replace('b','')
g = [b[i:i+2] for i in range(0, len(b), 2)]
dna = ""
for i in g:
    if i == "00":
        dna += "A"
    elif i == "01":
        dna += "T"
    elif i == "10":
        dna += "G"
    elif i == "11":
        dna += "C"
print(x) #hexdump
print(b) #converted to binary
print(dna) #converted to "DNA"