簡體   English   中英

在 python 中替代讀取二進制文件而不是 C++

[英]alternative reading binary in python instead of C++

我有一個二進制文件和 C++ 代碼,可以像跟隨一樣讀取該二進制文件。

int NumberOfWord;
FILE *f = fopen("../data/vec.bin", "rb");
fscanf(f, "%d", &NumberOfWord);
cout << NumberOfWord< <endl;

這個輸出是:

114042

我想在python中重新實現上面的代碼。

with open("../data/vec.bin","rb") as f:
    b = f.read(8)
    print struct.unpack("d",b)[0]

但此代碼不起作用。 我的輸出是:

8.45476330511e-53

我的問題是:

1) 為什么整數在 C++ 中有 8 個字節。

我從來不知道 %d 意味着雙倍。 但是,實際上該變量具有整數類型,但通常我們在 C++ 中使用“%d”輸出。 真奇怪。

2)如何在python中提取實數

我想在python代碼中提取一個像上面C++代碼一樣的實數。 那我怎么辦??

也許,我誤解了 python 中的 struct 模塊。

由於您已經能夠使用此 C++(或者更確切地說是 C)行正確讀取文件, fscanf(f, "%d", &NumberOfWord); ,我假設您的文件包含 114042 的文本表示。因此它包含字節

0x31 0x31 0x34 0x30 0x34 0x32 ...'1', '1', '4', '0', '4', '2', ...

當您在文本編輯器中打開它時,您可以看到一行114042

現在,當您嘗試使用i格式讀取 if 為二進制文件時,您使用文件的第 4 個字節並實際獲得int('31313034', 16) : 825308208。我無法重現您使用d格式獲得的內容以將其解碼為翻倍,因為我猜不出最后一位數字后你的文件里有什么......

如果數字單獨出現在第一行,這很容易:只需讀取一行並將其轉換為 int:

with open("../data/vec.bin","rb") as f:
    print int(f.readline())

如果最后一位數字后還有其他字符,則必須首先使用正則表達式(不要忘記導入re )來獲取數值,然后將其轉換為 int:

with open("../data/vec.bin","rb") as f:
    line = f.readline()
    m = re.match(t'\s*\d*', line)
    print(int(m.group(0)))

TL/DR:不要試圖讀取文本文件,就好像它包含二進制表示一樣

在 C 格式字符串中, %d是十進制的縮寫。

在 Python 中, d是 double 的縮寫。

如果它是一個整數,你應該在struct.unpack調用中使用i

with open("../data/vec.bin","rb") as f:
    b = f.read()
    print struct.unpack("i",b)[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM