溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么對(duì)文件進(jìn)行操作

發(fā)布時(shí)間:2021-07-05 18:03:12 來源:億速云 閱讀:197 作者:Leah 欄目:編程語言

Python中怎么對(duì)文件進(jìn)行操作,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

編碼方式

編碼方式的歷史大致為ASCII ->gb2312->unicode->utf-8,期間具體詳細(xì)信息可以百度

來個(gè)編碼解碼的小例子先,記住中文可以進(jìn)行GBK和utf-8編碼,在GBk一個(gè)中文字符對(duì)應(yīng)兩個(gè)字節(jié),在utf-8一個(gè)中文字符對(duì)應(yīng)三個(gè)字節(jié),中文不能進(jìn)行ASCII編碼。

>>> '劉潤(rùn)森'.encode('GBK') b'\xc1\xf5\xc8\xf3\xc9\xad' >>> '劉潤(rùn)森'.encode('ascii') Traceback (most recent call last):   File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) >>> 'Runsen'.encode('ascii') b'Runsen' >>> "劉潤(rùn)森".encode('utf-8') b'\xe5\x88\x98\xe6\xb6\xa6\xe6\xa3\xae' >>> '劉潤(rùn)森'.encode('GBK').decode('GBK') '劉潤(rùn)森' >>> '劉潤(rùn)森'.encode('GBK').decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte

如果編碼解碼格式不一致可能會(huì)出現(xiàn)亂碼,encode表示編碼,decode表示解碼。

文件操作的API

下面是Python文件操作的具體的API。

Python中怎么對(duì)文件進(jìn)行操作

打開文件

Python的open()函數(shù)打開一個(gè)文件時(shí),有若干個(gè)參數(shù)可用。然而,最常用的參數(shù)只有前兩個(gè)。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None,  closefd=True,  opener=None)注意,第一個(gè)是強(qiáng)制性的,其余的是可選的。如果不添加mode參數(shù),文件將在Python中以只讀模式打開。

encoding:可以不寫。不寫參數(shù),默認(rèn)的編碼本是操作系統(tǒng)默認(rèn)的編碼本。windows默認(rèn)gbk,linux默認(rèn)utf-8,mac默認(rèn)utf-8。

f=open('test.txt',encoding='utf-8')   #打開文件 data=f.read()  #讀取文件 print(data) f.close() #關(guān)閉文件

mode

Python中怎么對(duì)文件進(jìn)行操作

讀取文件

代碼中用到的文件文件操作的1.txt 文件內(nèi)容如下:

關(guān)注《Python之王》公眾號(hào) 作者:Runsen

readline(),使用該方法時(shí),需要指定打開文件的模式為r或者r+;

readlines(),讀取全部行.返回一個(gè)列表,列表中的每個(gè)元素是原文件的每一行。如果文件很大,占內(nèi)存,容易崩盤。

# 打開文件進(jìn)行讀取 f = open("1.txt","r",encoding='utf-8') # 根據(jù)大小讀取文件內(nèi)容 print('輸出來自 read() 方法\n',f.read(2048)) # 關(guān)閉文件 f.close() # 打開文件進(jìn)行讀寫 f = open("1.txt","r+",encoding='utf-8') # 讀取第2個(gè)字和第2行行的文件內(nèi)容 print('輸出來自 readline() 方法\n',f.readline(2)) print('輸出來自 readlines() 方法\n',f.readlines(2)) # 關(guān)閉文件 f.close() # 打開文件進(jìn)行讀取和附加 f = open("1.txt","r",encoding='utf-8') # 打開文件進(jìn)行讀取和附加 print('輸出來自 readlines() 方法\n',f.readlines()) # 關(guān)閉文件 f.close()  # 輸出如下 輸出來自 read() 方法  關(guān)注《Python之王》公眾號(hào) 作者:Runsen 輸出來自 readline() 方法  關(guān)注 輸出來自 readlines() 方法  ['《Python之王》公眾號(hào)\n'] 輸出來自 readlines() 方法  ['關(guān)注《Python之王》公眾號(hào)\n', '作者:Runsen']

寫入文件

下面只介紹清除寫 w和追加寫 a

案例:將關(guān)注《Python之王》公眾號(hào)寫入 test.txt 文件中

# mode=w 沒有文件就創(chuàng)建,有就清除內(nèi)容,小心使用 with open('test.txt', 'w', encoding='utf-8') as fb:       fb.write('關(guān)注《Python之王》公眾號(hào)\n')

下面再將作者:Runsen寫入test.txt 文件中

with open('test.txt', 'w', encoding='utf-8') as fb:       fb.write('作者:Runsen\n')

運(yùn)行后會(huì)發(fā)現(xiàn)之前寫的關(guān)注《Python之王》公眾號(hào)內(nèi)容修改為作者:Runsen,因?yàn)? w模式會(huì)清除原文件內(nèi)容,所以小心使用。只要使用了w,就要一次性寫完。

追加寫 a

案例:將靜夜思這首詩(shī)追加到 test.txt 文件中

# mode=a 追加到文件的最后 with open('test.txt', 'a', encoding='utf-8') as fb:       fb.write('關(guān)注《Python之王》公眾號(hào)\n')   with open('test.txt', 'a'encoding='utf-8') as fb:       fb.write('作者:Runsen\n')

指針操作

事物或資源都是以文件的形式存在,比如消息、共享內(nèi)存、連接等,句柄可以理解為指向這些文件的指針。

句柄(handle)是一個(gè)來自編譯原理的術(shù)語,指的是一個(gè)句子中最先被規(guī)約的部分,所以帶有一個(gè)「句」字。

句柄的作用就是定位,兩個(gè)APi還是tell和seek。

tell返回文件對(duì)象在文件中的當(dāng)前位置,seek將文件對(duì)象移動(dòng)到指定的位置,傳入的參數(shù)是offset ,表示移動(dòng)的偏移量。

下面通過示例對(duì)上述函數(shù)作進(jìn)一步了解,如下所示:

with open('test.txt', 'rb+') as f:     f.write(b'Runsen')     # 文件對(duì)象位置     print(f.tell())     # 移動(dòng)到文件的第四個(gè)字節(jié)     f.seek(3)     # 讀取一個(gè)字節(jié),文件對(duì)象向后移動(dòng)一位     print(f.read(1))     print(f.tell())     # whence 為可選參數(shù),值為 0 表示從文件開頭起算(默認(rèn)值)、值為 1 表示使用當(dāng)前文件位置、值為 2 表示使用文件末尾作為參考點(diǎn)     # 移動(dòng)到倒數(shù)第二個(gè)字節(jié)     f.seek(-2, 2)     print(f.tell())     print(f.read(1))      #輸出如下 6 b's' 4 50

上下文管理

我們會(huì)進(jìn)行這樣的操作:打開文件,讀寫,關(guān)閉文件。程序員經(jīng)常會(huì)忘記關(guān)閉文件。上下文管理器可以在不需要文件的時(shí)候,自動(dòng)關(guān)閉文件,使用with  open即可。

# with context manager with open("new.txt", "w") as f:     print(f.closed)     f.write("Hello World!") print(f.closed)  #輸出如下 False True

如何批量讀取多個(gè)文件

下面,批量讀取某文件夾下的txt文件

Python中怎么對(duì)文件進(jìn)行操作

file_list = ['1.txt', '2.txt', '3.txt','4.txt'] for path in file_list:     with open(path, encoding='utf-8') as f:         for line in f:             print(line)

下面將批量讀取文件夾下的txt文件的內(nèi)容,合并內(nèi)容到一個(gè)新文件5.txt中,具體實(shí)現(xiàn)的代碼如下。

import os #獲取目標(biāo)文件夾的路徑 filedir = os.getcwd()+'\\'+'\\txt' #獲取當(dāng)前文件夾中的文件名稱列表 filenames = [] for i in os.listdir(filedir):     if i.split(".")[-1] == 'txt':         filenames.append(i) #打開當(dāng)前目錄下的5.txt文件,如果沒有則創(chuàng)建 f = open('5.txt','w') #先遍歷文件名 for filename in filenames:     filepath = filedir+'\\'+filename     #遍歷單個(gè)文件,讀取行數(shù)     for line in open(filepath,encoding='utf-8'):         f.writelines(line)         f.write('\n') #關(guān)閉文件 f.close()

其實(shí)在Window中只需要cd 至目標(biāo)文件夾,即你需要將所有想要合并的txt文件添加至目標(biāo)文件夾中,執(zhí)行如下DOS命令 type *.txt >  C:\目標(biāo)路徑\合并后的文件名.txt

練習(xí)

題目:創(chuàng)建文件data.txt,文件共100000行,每行存放一個(gè)1~100之間的整數(shù),題目來源:???/p>

import random  f = open(&lsquo;data.txt&rsquo;,&lsquo;w+&rsquo;) for i in range(100000):   f.write(str(random.randint(1,100)) + &lsquo;\n&rsquo;)   f.seek(0)   print(f.read())   f.close()

題目:生成100個(gè)MAC地址并寫入文件中,MAC地址前6位(16進(jìn)制)為01-AF-3B,題目來源:???/p>

import random import string  def create_mac():   MAC='01-AF-3B'   hex_num =string.hexdigits #0123456789abcdefABCDEF   for i in range(3):     n = random.sample(hex_num,2)     sn = '-' + ''.join(n).upper()     MAC += sn   return MAC  def main():   with open('mac.txt','w') as f:     for i in range(100):       mac = create_mac()       print(mac)       f.write(mac+'\n')  main()

Python中怎么對(duì)文件進(jìn)行操作

看完上述內(nèi)容,你們掌握Python中怎么對(duì)文件進(jìn)行操作的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI