當前位置:首頁 » 編程語言 » python二進制文件讀寫

python二進制文件讀寫

發布時間: 2022-12-20 00:50:44

python3二進制文件讀寫直接加b不行嗎

二進制模式,通常用來讀取圖片、視頻等二進制文件。注意,它在讀寫的時候是以bytes類型讀寫的,因此獲得的是一個bytes對象而不是字元串。在這個讀寫過程中,需要自己指定編碼格式。在使用帶b的模式時一定要注意傳入的數據類型,確保為bytes類型。

s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','w')
f.write(s)

##這樣沒問題,正常寫入了文件。

##-------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb') ##注意多了個b
f.write(s)

##報錯
TypeError: a bytes-like object is required, not 'str'
##意思是它需要一個bytes類型數據,你卻給了個字元串

##---------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb') ##注意多了個b
f.write(b) ##將變數b傳給它,b是個bytes類型
二、 + 模式:
對於w+模式,在讀寫之前都會清空文件的內容,建議不要使用!

對於a+模式,永遠只能在文件的末尾寫入,有局限性,建議不要使用!

對於r+模式,也就是讀寫模式,配合seek()和tell()方法,可以實現更多操作。

三、 編碼問題
要讀取非UTF-8編碼的文件,需要給open()函數傳入encoding參數,例如,讀取GBK編碼的文件:

>>> f = open('gbk.txt', 'r', encoding='gbk')
>>> f.read()
'GBK'
遇到有些編碼不規范的文件,可能會拋出UnicodeDecodeError異常,這表示在文件中可能夾雜了一些非法編碼的字元。遇到這種情況,可以提供errors參數,表示如果遇到編碼錯誤後如何處理。

>>> f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')
四、 文件對象操作
每當我們用open方法打開一個文件時,將返回一個文件對象。這個對象內置了很多操作方法。下面假設,已經打開了一個f文件對象。

1. f.read(size)
讀取一定大小的數據, 然後作為字元串或位元組對象返回。size是一個可選的數字類型的參數,用於指定讀取的數據量。當size被忽略了或者為負值,那麼該文件的所有內容都將被讀取並且返回。

f = open("1.txt", "r")

str = f.read()
print(str)

f.close()
如果文件體積較大,請不要使用read()方法一次性讀入內存,而是read(512)這種一點一點的讀。

2. f.readline()
從文件中讀取一行n內容。換行符為' '。如果返回一個空字元串,說明已經已經讀取到最後一行。這種方法,通常是讀一行,處理一行,並且不能回頭,只能前進,讀過的行不能再讀了。

f = open("1.txt", "r")
str = f.readline()
print(str)
f.close()
3. f.readlines()
將文件中所有的行,一行一行全部讀入一個列表內,按順序一個一個作為列表的元素,並返回這個列表。readlines方法會一次性將文件全部讀入內存,所以也存在一定的風險。但是它有個好處,每行都保存在列表裡,可以隨意存取。

f = open("1.txt", "r")
a = f.readlines()
print(a)
f.close()
4. 遍歷文件
實際上,更多的時候,我們將文件對象作為一個迭代器來使用。

# 打開一個文件
f = open("1.txt", "r")

for line in f:
print(line, end='')

# 關閉打開的文件
f.close()
這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline方法一樣只能前進,不能回退。

幾種不同的讀取和遍歷文件的方法比較:如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)比較保險;如果是配置文件,調用readlines()最方便。普通情況,使用for循環更好,速度更快。

5. f.write()
將字元串或bytes類型的數據寫入文件內。write()動作可以多次重復進行,其實都是在內存中的操作,並不會立刻寫回硬碟,直到執行close()方法後,才會將所有的寫入操作反映到硬碟上。在這過程中,如果想將內存中的修改,立刻保存到硬碟上,可以使用f.flush()方法,但這可能造成數據的不一致。

# 打開一個文件
f = open("/tmp/foo.txt", "w")

f.write("Python 是一種非常好的語言。
我喜歡Python!!
")

# 關閉打開的文件
f.close()
6. f.tell()
返迴文件讀寫指針當前所處的位置,它是從文件開頭開始算起的位元組數。一定要注意了,是位元組數,不是字元數。

7. f.seek()
如果要改變位置指針的位置, 可以使用f.seek(offset, from_what)方法。seek()經常和tell()方法配合使用。

from_what的值,如果是0表示從文件開頭計算,如果是1表示從文件讀寫指針的當前位置開始計算,2表示從文件的結尾開始計算,默認為0,例如:

offset:表示偏移量。

seek(x,0) : 從起始位置即文件首行首字元開始移動 x 個字元
seek(x,1) : 表示從當前位置往後移動x個字元
seek(-x,2):表示從文件的結尾往前移動x個字元
看一個例子:

>>> f = open("d:\1.txt", "rb+")
>>> f.write(b"1232312adsfalafds")
17
>>> f.tell()
17
>>> f.seek(5)
5
>>> f.read(1)
b'1'
>>> f.seek(-3, 2)
14
>>> f.read(1)
b'f'
8. f.close()
關閉文件對象。當處理完一個文件後,調用f.close()來關閉文件並釋放系統的資源。文件關閉後,如果嘗試再次調用該文件對象,則會拋出異常。忘記調用close()的後果是數據可能只寫了一部分到磁碟,剩下的丟失了,或者更糟糕的結果。也就是說大象塞進冰箱後,一定不要忘記關上冰箱的門。

Ⅱ python讀取C#寫的二進制文件,byte類型unpack

        近期有一部分早期記錄數據,C#寫的二進制數據,在讀取的過程中,short和unshort類型還是比較好轉換的,但是碰到byte類型,對照struct的說明是x,設置讀取格式時,這部分會空出來,讀不出來。查看說明C#的byte類型在python是no value,用x讀不出來。因為大概知道數據是整數類型的,於是用b(與B區別,是否有負值),也是1個位元組,和C#中的byte一樣長度,可以正確顯示出來數據。如果是字元類,可以考慮c,s,p。注意變數所佔位元組數。(讀出來數據最好測試驗證一下)。

def readWrite(fname):

    with open(fname,'rb') as f:

        if fname[-3:] == 'RPT' :    #文件格式是RPT格式的二進制文件

            data = f.read()

           #fmt = 'H16x2H4x2H10x5H2h6H'   #數據格式中x會導致數據忽略掉,讀不出來

           fmt = 'H16b2H4b2H10b5H2h6H'   #採用b替換後,數據格式顯示正常

            data1= struct.unpack(fmt,data)

        elif fname[-3:] == 'DAY':     #文件格式時DAY格式的二進制文件

            data = f.read()

            fmt = '4i'

            data1= struct.unpack(fmt,data)

        else:

            data1 = '不是指定文件或文件錯誤'

            print('不是指定文件')

    return data1

Ⅲ python 怎樣讀取visual c++二進制文件格式

1.python 二進制文件的讀寫
只討論二進制文件的讀寫。
以二進制的形式打開文件
with open(filename , 'wb') as fd :
#do with fd
fd.write(strobject)#二進制strobject寫入文件
fd.read(byte_len)#讀取byte_len位元組數據
wb:表示以二進制寫的方式打開文件
rb :表示以二進制讀的方式打開文件
2.關於進制的轉換
需要使用到struct進行打包成二進制字元串或者相應的解包成元組。
#根據format形式,把後面的變數v1,v2,...打包成位元組對象形式
byte_objects = struct.pack(format,v1,v2,...)
#根據format形式,從buffer中解包出數據,返回值的形式是元組
value_tuple = struct.unpack(format,buffer)
3.讀寫幾種數據類型的例子
#寫入文件
with open('test.data','wb') as fd:
i = 1
bi = struct.pack('i',i) #'i'表示對int類型進行打包
fd.write(bi)
f = 2.1
bf = struct.pack('f',f) #'f'表示對float類型進行打包
fd.write(bf)
d = 3.1
bd = struct.pack('d',d) #'d'表示對double類型進行打包
fd.write(bd)
l = 4L
bl = struct.pack('l',l)#'l'表示對long類型進行打包
fd.write(bl)
#讀取文件
with open('test.data','rb') as fd:
byte_len = 4
bi = fd.read(byte_len) #讀取int類型的4個位元組的二進制數據
print struct.unpack('i',bi) #解壓成原來的int類型
bf = fd.read(byte_len) #讀取float類型的4個位元組的二進制數據
print struct.unpack('f',bf) #解壓成原來的float類型
byte_len = 8
bd = fd.read(byte_len) #讀取double類型的8個位元組的二進制數據
print struct.unpack('d',bd) #解壓成原來的double類型
bl = fd.read(byte_len) #讀取long類型的8個位元組的二進制數據
print struct.unpack('l',bl)#解壓成原來的long類型
關於C/C++裡面的數據類型在Python裡面對應的數據類型以及佔用的位元組大小,參考下面的網站。
https://docs.python.org/3/library/struct.html#format-characters
4.測試關於c++讀去python生成的文件
/**c++ ifstream**/
void readifstream(const char* filename){
cout << "ifstream " << endl;
ifstream ifs(filename,ifstream::binary);
if(!ifs){
cerr << "open file error " << endl;
exit(0);
}
int i;
float f;
double d;
long l;
ifs.read((char*)&i,sizeof(i));
ifs.read((char*)&f,sizeof(f));
ifs.read((char*)&d,sizeof(d));
ifs.read((char*)&l,sizeof(l));
ifs.close();
cout <<"i="<< i << " f="<< f <<" d="<< d <<" l=" << l << endl;
cout << "==============cout======================" << endl;
}
/**c FILE*/
void readFILE(const char* filename){
printf("readFILE\n");
FILE * fid = fopen(filename,"rb");
if(!fid){
perror("open file error \n");
exit(0);
}
const int size = 1;
int i;
float f;
double d;
long l;
fread((char*)&i,sizeof(i),size,fid);
fread((char*)&f,sizeof(f),size,fid);
fread((char*)&d,sizeof(d),size,fid);
fread((char*)&l,sizeof(l),size,fid);
fclose(fid);
printf("i=%d f=%.2f d=%.2lf l=%ld\n",i,f,d,l);
printf( "================printf====================\n");
}

Ⅳ python 二進制讀寫和一般讀寫的區別

w+打開文件會將原文件內容刪除,可以同時對文件進行讀寫 r+打開文件會保持原文件內容不變,同樣可以同時對文件進行讀寫

Ⅳ 利用python讀寫二進制文件

思路:首先寫入一個矩陣到二進制文件中,然後讀取二進制文件恢復到另外一個矩陣中。
(推薦教程:python基礎教程)
具體代碼實現:
相關推薦:python爬蟲視頻教程

Ⅵ Python中的文件讀寫-理論知識

Python處理兩種不同類型的文件:二進制文件和文本文件。了解兩者之間的差異很重要,因為它們的處理方式不同。

二進制文件

在正常計算機使用期間使用的大多數文件實際上是二進制文件,而不是文本。比如:Microsoft Word .doc文件實際上是一個二進制文件,即使它只有文本。

二進制文件的其他示例包括:

圖像文件,包括.jpg,.png,.bmp,.gif,等。

資料庫文件包括.mdb,.frm和.sqlite

文件,包括.doc,.xls,.pdf或者其他文件。

那是因為這些文件都有特殊處理的要求,需要特定類型的軟體來打開它。例如,您需要Excel來打開.xls文件,並使用資料庫程序來打開.sqlite文件。

文本文件

一方面,沒有特定的編碼,可以通過沒有任何特殊處理的標准文本編輯器打開。但是,每個文本文件都必須遵守一組規則:

文本文件必須是可讀的。他們可以(並且經常會)包含許多特殊編碼,尤其是在HTML或其他標記語言中,但您仍然可以說出它的含義

文本文件中的數據按行組織。在大多數情況下,每一行都是一個獨特的元素,無論是指令行還是命令。

此外,文本文件在每行的末尾都有一個看不見的字元,這使文本編輯器知道應該有一個新行。通過編程與這些文件交互時,您可以利用該字元。在Python中,它用「 n」 表示。

在哪裡可以找到Python的文件I / O工具

在Python中工作時,您不必擔心導入任何特定的外部庫來處理文件。Python附帶有「文件庫」,文件I / O工具和實用程序是核心語言的內置部分。

但是在其他語言(如C ++)中,要處理文件,您必須通過包含正確的頭文件來啟用文件I / O工具#include <fstream>。如果您使用java編寫代碼,則需要使用該import java.io.*語句。

使用Python,就沒有必要這樣做,這是因為Python有一組內置函數,可以處理讀取和寫入文件所需的所有內容。

Ⅶ 如何用python生成和讀取二進制文件

withopen('a.jpg','rb')asf:
s=f.read()
withopen('b.exe','wb')asf:
f.write(s)

Ⅷ 在python中如何從二進制文件中讀取信息

你是指讀入二進制文件吧?
可以使用numpy.fromfile(),也可以使用open(filename, 'rb'),其中的'b'就是二進制的意思,然後使用文件類型的read方法,讀取一些位元組,再用struct.unpack()方法來解析二進制。
第一種方法是一次性讀入文件(或文件的前多少個連續位元組)到一個數組中,因此,靈活性差。
第二種方法靈活性很高,可以讀取任意位置(使用文件的seek()方法跳躍位置)的二進制數據,再使用struct.unpack()方法來進行各種二進制解析。

提示:二進制文件是不保留存儲方式的數據格式,因此,讀二進制文件時應該知道二進制文件的存儲格式。

Ⅸ python二進制文件的讀取與寫入可以分別使用 和 方法

可以使用read方法和readline方法

Ⅹ Python文件操作,看這篇就足夠!

文件的存儲方式

在計算機中,文件是以二進制的方式保存在磁碟上的文本文件和二進制文件

文本文件可以使用文本編輯軟體查看本質上還是二進制文件

二進制文件保存的內容不是給人直接閱讀的,而是提供給其她軟體使用的二進制文件不能使用文件編輯軟體查看

文件基本操作

在計算機中要操作文件一共包含三個步驟:1.打開文件2.讀、寫文件

讀 將文件內容讀入內容寫 將內存內容寫入文件

模式描述

t文本模式 (默認)。

x寫模式,新建一個文件,如果該文件已存在則會報錯。

b二進制模式。

+打開一個文件進行更新(可讀可寫)。

U通用換行模式(不推薦)。

r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。

rb以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。

r+打開一個文件用於讀寫。文件指針將會放在文件的開頭。

rb+以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。

w打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。

wb以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。

w+打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。

wb+以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。

a打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。

ab以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。

a+打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。

ab+以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

文件打開模式有很多,但是我們實際用到的就只有六種。

我們總結一下主要用到的是下面六種

模式可做操作若文件不存在是否覆蓋文件原來內容

r只讀報錯——

r+可讀、可寫報錯是

w只寫創建是

w+可讀、可寫創建是

a只寫創建否,追加寫

a+可讀、可寫創建否,追加寫

只讀模式打開文件——只讀(r)

文件若不存在報錯:

讀寫模式打開文件——讀寫模式(r+)

數據寫入之前:

數據寫入之後:

會替換掉相同長度的內容

文件若不存在報錯:

寫模式打開文件——寫模式(w)

數據寫入之前:

數據寫入之後:

這種操作會刪除原來的文件內容,重新寫入Python,

並且把游標放在文件最開始。

若文件不存在,系統會創建該文件夾並重新寫入內容

讀寫模式打開文件——讀寫模式(w+)

數據寫入之前:

數據寫入之後:

這種操作會刪除原來的文件內容,重新寫入Python,

並且把游標放在文件最開始。

若文件不存在,系統會創建該文件夾並重新寫入內容

利用這個原理所以文件寫模式(w)、讀寫模式(w+)還可以用作刪除文件內容。

因為他們整個工作原理就是把文件原來的內容刪除,然後寫入新的內容。

如果我們寫入的內容為空,那麼不就是刪除文件內容。

數據寫入之前:

數據寫入之後:

寫模式打開文件(追加內容)——寫模式(a)

數據寫入之前:

數據寫入之後:

可以看到是在原先內容的基礎上在文末追加新的內容!

若文件不存在,系統會創建新的文件夾並寫入內容

讀寫模式打開文件(追加內容)——讀寫模式(a)

數據寫入之前:

數據寫入之後:

可以看到是在原先內容的基礎上在文末追加新的內容!

若文件不存在,系統會創建新的文件夾並寫入內容

二進制模式打開文件

我們看到了在文件打開模式中有以下模式:rb、wb……有這種帶 b 的。

什麼意思呢?

就是用二進制的方式打開文件。

很明顯,我們出現了以下錯誤:

主要原因是因為編碼的問題,可能是因為0x82這個位元組在gbk編碼中沒有這個字元,

可能原字元是兩個位元組,在gbk里被解析成了一個位元組,導致字元不存在。

這就是我們文件打開方式需要使用二進制讀取的原因。

文件操作

open 函數負責打開文件,並且返迴文件對象

read /write / close 三個方法都需要通過文件對象 來調用

文件和文件夾的操作

在Python中⽂件和⽂件夾的操作要藉助os模塊⾥⾯的相關功能,

具體步驟如下:

導⼊os模塊

使⽤ os 模塊相關功能

1、文件重命名

2、刪除文件

3、創建文件夾

4、刪除文件夾

5、獲取當前目錄

6、改變默認目錄

7、獲取目錄列表

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:525
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:24
linux485 發布:2025-07-05 14:38:28 瀏覽:304
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:754
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:431
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:698
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:240
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:685
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:282
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:834