2016-04-14 23 views
1

Bulmak istediğim bazı kayan nokta sayılarının olduğu ASCII ile karışık bir ikili dosyam var. Dosya bu gibi bazı satırları içerir:Python ile ikili dosyada kayan nokta sayıları nasıl bulunur?

1,1,'11.2','11.3';1,1,'100.4';

sevdiğim regex test ben doğru regex ([0-9]+\.{1}[0-9]+) olması gerektiğini buldum.

import re 

data = open('C:\\Users\\Me\\file.bin', 'rb') 
pat = re.compile(b'([0-9]+\.{1}[0-9]+)') 
print(pat.match(data.read())) 

Ben tek maç alamadım, o yüzden: Burada

kodu? Python 3.5.1'deyim.

+0

Dizeleri geçit olarak mı temsil ediyorsunuz? – Adib

+0

Evet, ASCII kodlu. – JohnnyFromBF

+1

ASCII * ile karışık bir ikili dosya nedir ve ASCII ve ikili parçaları nasıl tanımlayabilirsiniz? Dosyayı nasıl güvenli bir şekilde okuyabileceğinizi size anlatamayacağımı bilmeden. BTW, regex '1'le eşleşmiyor, '.5',' 1'den bahsetmiyoruz (fakat bu son kısım için başarısız olmak istenebilir) –

cevap

2

Böyle deneyebilirsiniz,

import re 
with open('C:\\Users\\Me\\file.bin', 'rb') as f: 
    data = f.read() 

re.findall("\d+\.\d+", data) 

Çıktı:

['11.2', '11.3', '100.4'] 

re.findall döner string listesi. dönüştürmek istediğiniz Eğer

>>> list(map(float, re.findall("\d+\.\d+", data))) 
[11.2, 11.3, 100.4] 
+0

Çalışmıyor, 'TypeError: beklenen dize veya bayt benzeri nesne' anlatıyor. Bu ikili şeyler içerir. – JohnnyFromBF

+0

@JohnnyFromBF denemelisiniz, 're.findall ("\ d + \. \ D +", data.read()) ' –

+0

Hala korkuyorum,' TypeError: bayt benzeri bir nesne üzerinde bir dize deseni kullanamazsınız '. – JohnnyFromBF

2

How to find floating point numbers in binary file with Python?

float_re = br"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?" 
for m in generate_tokens(r'C:\Users\Me\file.bin', float_re): 
    print(float(m.group())) 

nerede float_re is from this answer ve generate_tokens() is defined here böyle yapabiliriz yüzer.


pat.match() çalışır giriş dizesi en başında maç için ve dize bir şamandıra ile başlamaz ve bu nedenle "tek maç alamadım". desen Unicode (str) ama data sizin durumunuzda bir bytes nesnedir çünkü


re.findall("\d+\.\d+", data)TypeError üretir. Deseni bytes:
re.findall(b"\d+\.\d+", data)

+0

Kalıbınız, bir hata olduğuna inanıyorum, önde gelen işareti karakterinden sonra bir boşluk sağlar. Örneğin, "- 2.2" bir kayan nokta numarası değil, "-2.2" dir. –

+0

Ayrıca, gerçekten pedantic olmak istiyorsanız, bunun 32 veya 64 bit kayan nokta değeri olup olmadığını biliyorsanız izin verilen üs sayısının sayısını sınırlayabilirsiniz. –

+0

@SteveHollasch Float nedir, ne de bir tanım tanımı değildir. Normal ifadenin kökenini açıklayan bağlantıyı takip edin. – jfs

İlgili konular