Python學習—檔案操作

來源:互聯網
上載者:User

標籤:重新命名檔案   rip   實現   col   上下   dev   res   fsync   linux作業系統   

1.檔案基礎知識

1.檔案是儲存在外部介質上的資料的集合,檔案的基本單位是位元組,檔案所含的位元組數就是檔案的長度。每個位元組都有一個預設的位置,位置從0開始,檔案頭的位置就是0,檔案尾的位置是檔案內容結束後的後一個位置,該位置上沒有檔案內容,為空白。檔案的讀寫操作從檔案指標所在的位置開始,即讀會從檔案指標所在的位置開始讀取,寫會從檔案指標所在的位置開始寫,如有內容,則會被覆蓋。
2.按檔案中資料的組織形式把檔案分為文字檔和二進位檔案兩類。文字檔儲存的是常規字串,由文本行組成,通常以分行符號‘\n‘結尾,只能讀寫常規字串。文字檔可以用文書處理軟體如gedit、記事本等進行查看編輯。常規字串是指文字編輯器能正常顯示、編輯的字串,如英文字母串、漢字串、數字串。二進位檔案把對象在記憶體中的內容以位元組串(bytes)的形式進行儲存。不能用文書處理軟體進行編輯。

2.檔案的開啟或建立
格式:檔案變數名 = open(檔案名稱[,開啟檔案[,緩衝區]])

檔案名稱指定被開啟檔案對象
開啟檔案指定檔案開啟後能進行的處理方式
緩衝區制定了讀寫檔案的緩衝模式。0表示不緩衝,1表示緩衝,如大庾1則表示緩衝區的大小。預設值為1
open()函數返回一個檔案對象,通過該對象可以對檔案進行各種操作

1.普通文字檔

r:    - 只能讀,不能寫    - 讀取的檔案不存在, 報錯     - 報錯資訊:FileNotFoundError: [Errno 2] No such file or directory:xxxxxxr+:    - 可以執行讀寫操作    - 檔案不存在,報錯    - 預設情況下,從檔案指標所在位置開始寫入w:    - 只能寫,不能讀    - 檔案不存在,不報錯,自動建立檔案並開啟    - 會清空檔案內容w+:    - 可以執行讀寫操作    - 檔案不存在,不報錯,自動建立檔案並開啟    - 會清空檔案內容a:    - 只能寫,不能讀    - 檔案不存在,不報錯,自動建立檔案並開啟    - 不會清空檔案內容a+:    - 可以執行讀寫操作    - 檔案不存在,不報錯,自動建立檔案並開啟    - 不會清空檔案內容

2.二進位檔案:開啟檔案在普通文字檔上加‘b‘

rb:    - 只能讀,不能寫    - 讀取的檔案不存在,報錯rb+:    - 可以執行讀寫操作    - 檔案不存在,報錯    - 預設情況下,從檔案指標所在位置開始寫入wb:    - 只能寫,不能讀    - 檔案不存在,不報錯,自動建立檔案並開啟    - 會清空檔案內容wb+:    - 可以執行讀寫操作    - 檔案不存在,不報錯,自動建立檔案並開啟    - 會清空檔案內容ab:    - 只能寫,不能讀    - 檔案不存在,不報錯,自動建立檔案並開啟    - 不會清空檔案內容ab+:    - 可以執行讀寫操作    - 檔案不存在,不報錯,自動建立檔案並開啟    - 不會清空檔案內容
3.檔案常用方法
一、讀f.next()    #在檔案使用迭代器時會使用到,在迴圈中,next()方法會在每次迴圈中調用,該方法返迴文件的下一行,如果到達結尾(EOF),則觸發 StopIterationf.read([size])    #方法用於從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。f.readline([size])    #從檔案讀取整行,包括 "\n" 字元。如果指定了一個非負數的參數,則返回指定大小的位元組數,包括 "\n" 字元。f.readlines([size])    #讀取所有行(直到結束符 EOF)並返回列表,該列表可以由 Python 的 for... in ... 結構進行處理。如果碰到結束符 EOF 則返回Null 字元串。,若給定sizeint>0,則是設定一次讀多少位元組,這是為了減輕讀取壓力二、寫f.write([str])    #用於向檔案中寫入指定字串f.writelines(sequence_of_strings)    #向檔案中寫入一序列的字串三、其他動作f.flush()    #用來重新整理緩衝區的,即將緩衝區中的資料立刻寫入檔案,同時清空緩衝區,不需要是被動的等待輸出緩衝區寫入  f.seek(offset[, whence])    #於移動檔案讀取指標到指定位置       offset -- 開始的位移量,也就是代表需要移動位移的位元組數       whence -- 可選,預設值為 0。給offset參數一個定義,表示要從哪個位置開始位移;0代表從檔案開頭開始算起,1代表從當前位開始算起,2代表從檔案末尾算起。 f.tell()    #返迴文件指標當前位置f.truncate([ size ])    #截斷檔案,如果指定了選擇性參數 size,則表示截斷檔案為 size 個字元。 如果沒有指定 size,則從當前位置起截斷;截斷之後 size 後面的所有字元被刪除。f.close()    #用於關閉一個已開啟的檔案          f.closed    #返回true如果檔案已被關閉,否則返回false。f.fileno()    #方法返回一個整型的檔案描述符(file descriptor FD 整型),可用於底層作業系統的 I/O 操作。f.isatty()    #檢測檔案是否串連到一個終端裝置,如果是返回 True,否則返回 False四、以下兩個屬性在python2中有,在python3中已經被刪除了f.mode    #返回被開啟檔案的訪問模式。f.name    # 返迴文件的名稱。
4.安全上下文with

上下文管理器:開啟檔案, 執行完with語句內容之後, 自動關閉檔案對象

 with open(‘/tmp/passwd‘) as f:     print("with語句裡面:", f.closed)     print(f.read()) print("after with語句:", f.closed)

同時開啟兩個檔案對象( python2中不支援)

with    open(‘/tmp/passwd‘) as f1, open(‘/tmp/passwdBack‘, ‘w+‘) as f2:    # 將第一個檔案的內容寫入第二個檔案中,檔案複製即使如此。    f2.write(f1.read())    # 移動指標移動到檔案最開始    f2.seek(0,0)    # 讀取指標內容    print(f2.read())

python2中只能這麼實現

with open(‘/tmp/passwd‘) as f1:    content = f1.read()with open(‘/tmp/passwdBack‘, ‘w+‘):    f2.write(content)
5.yield實現讀取大檔案
# 1. 檔案操作   1). 建立檔案data.txt, 檔案共100000行, 每行存放一個1~100之間的整數.   2). 找出檔案中數字出現次數最多的10個數字, 寫入檔案mostNum.txt; import random with open(‘data.txt‘, mode=‘a+‘) as f:     for i in range(1000000):         f.write(str(random.randint(1,100))+‘\n‘)# 通過yield, 每次讀取一行進行處理 def byLineReader(filename):     with open(filename) as f:         line = f.readline()         # 如果可以讀取到內容, 返回該行資訊         while line:             yield  line             line = f.readline()# read是一個產生器對象, read = byLineReader(‘data.txt‘) print(read)# #1). next 讀取產生器的內容 print(next(read)) print(next(read)) ...# #2). 通過for迴圈 for item in read:     print(item)# ******** 檔案對象是可以for迴圈遍曆的, 預設遍曆的內容為每一行的內容.是節省記憶體空間的。from collections import Iterablef = open(‘data.txt‘)print(isinstance(f, Iterable))for i, item in enumerate(f):    if i == 10:        break    print(i, item)
6.os模組

os 模組提供了非常豐富的方法用來處理檔案和目錄。

import os# 1). 返回作業系統類型, 值為posix,是Linux作業系統, 值為nt, 是windows作業系統print(os.name)print(‘Linux‘ if os.name==‘posix‘ else ‘Windows‘)# 2). 作業系統的詳細資料info = os.uname()print(info)print(info.sysname)print(info.nodename)# 3). 系統內容變數print(os.environ)# 4). 通過key值擷取環境變數對應的value值print(os.environ.get(‘PATH‘))print(os.getenv(‘PATH‘))

遍曆指定目錄下所有內容

import osfrom os.path import joinfor root, dirs, files in os.walk(‘/var/log‘):    #print(root, dirs, files)    for name in files:        print(join(root, name))

os模組常用方法大全:

os.access(path, mode)檢驗許可權模式os.chdir(path)改變當前工作目錄os.chflags(path, flags)設定路徑的標記為數字標記。os.chmod(path, mode)更改許可權os.chown(path, uid, gid)變更檔所有者os.chroot(path)改變當前進程的根目錄os.close(fd)關閉檔案描述符 fdos.closerange(fd_low, fd_high)關閉所有檔案描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略os.dup(fd)複製檔案描述符 fdos.dup2(fd, fd2)將一個檔案描述符 fd 複製到另一個 fd2os.fchdir(fd)通過檔案描述符改變當前工作目錄os.fchmod(fd, mode)改變一個檔案的存取權限,該檔案由參數fd指定,參數mode是Unix下的檔案存取權限。os.fchown(fd, uid, gid)修改一個檔案的所有權,這個函數修改一個檔案的使用者ID和使用者組ID,該檔案由檔案描述符fd指定。os.fdatasync(fd)強制將檔案寫入磁碟,該檔案由檔案描述符fd指定,但是不強制更新檔案的狀態資訊。os.fdopen(fd[, mode[, bufsize]])通過檔案描述符 fd 建立一個檔案對象,並返回這個檔案對象os.fpathconf(fd, name)返回一個開啟的檔案的系統配置資訊。name為檢索的系統配置的值,它也許是一個定義系統值的字串,這些名字在很多標準中指定(POSIX.1, Unix 95, Unix 98, 和其它)。os.fstat(fd)返迴文件描述符fd的狀態,像stat()。os.fstatvfs(fd)返回包含檔案描述符fd的檔案的檔案系統的資訊,像 statvfs()os.fsync(fd)強制將檔案描述符為fd的檔案寫入硬碟。os.ftruncate(fd, length)裁剪檔案描述符fd對應的檔案, 所以它最大不能超過檔案大小。os.getcwd()返回當前工作目錄os.getcwdu()返回一個當前工作目錄的Unicode對象os.isatty(fd)如果檔案描述符fd是開啟的,同時與tty(-like)裝置相連,則返回true, 否則False。os.lchflags(path, flags)設定路徑的標記為數字標記,類似 chflags(),但是沒有軟連結os.lchmod(path, mode)修改串連檔案許可權os.lchown(path, uid, gid)變更檔所有者,類似 chown,但是不追蹤連結。os.link(src, dst)建立永久連結,名為參數 dst,指向參數 srcos.listdir(path)返回path指定的檔案夾包含的檔案或檔案夾的名字的列表。os.lseek(fd, pos, how)設定檔案描述符 fd當前位置為pos, how方式修改: SEEK_SET 或者 0 設定從檔案開始的計算的pos; SEEK_CUR或者 1 則從當前位置計算; os.SEEK_END或者2則從檔案尾部開始. 在unix,Windows中有效os.lstat(path)像stat(),但是沒有軟連結os.major(device)從原始的裝置號中提取裝置major號碼 (使用stat中的st_dev或者st_rdev field)。os.makedev(major, minor)以major和minor裝置號組成一個原始裝置號os.makedirs(path[, mode])遞迴檔案夾建立函數。像mkdir(), 但建立的所有intermediate-level檔案夾需要包含子檔案夾。os.minor(device)從原始的裝置號中提取裝置minor號碼 (使用stat中的st_dev或者st_rdev field )。os.mkdir(path[, mode])以數字mode的mode建立一個名為path的檔案夾.預設的 mode 是 0777 (八進位)。os.mkfifo(path[, mode])建立具名管道,mode 為數字,預設為 0666 (八進位)os.mknod(filename[, mode=0600, device])建立一個名為filename檔案系統節點(檔案,裝置特別檔案或者命名pipe)。os.open(file, flags[, mode])開啟一個檔案,並且設定需要的開啟選項,mode參數是可選的os.openpty()開啟一個新的偽終端對。返回 pty 和 tty的檔案描述符。os.pathconf(path, name)返回相關檔案的系統配置資訊。os.pipe()建立一個管道. 返回一對檔案描述符(r, w) 分別為讀和寫os.popen(command[, mode[, bufsize]])從一個 command 開啟一個管道os.read(fd, n)從檔案描述符 fd 中讀取最多 n 個位元組,返回包含讀取位元組的字串,檔案描述符 fd對應檔案已達到結尾, 返回一個Null 字元串。os.readlink(path)返回軟連結所指向的檔案os.remove(path)刪除路徑為path的檔案。如果path 是一個檔案夾,將拋出OSError; 查看下面的rmdir()刪除一個 directory。os.removedirs(path)遞迴刪除目錄。os.rename(src, dst)重新命名檔案或目錄,從 src 到 dstos.renames(old, new)遞迴地對目錄進行更名,也可以對檔案進行更名。os.rmdir(path)刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。os.stat(path)擷取path指定的路徑的資訊,功能等同於C API中的stat()系統調用。os.stat_float_times([newvalue])決定stat_result是否以float對象顯示時間戳記os.statvfs(path)擷取指定路徑的檔案系統統計資訊os.symlink(src, dst)建立一個軟連結os.tcgetpgrp(fd)返回與終端fd(一個由os.open()返回的開啟的檔案描述符)關聯的進程組os.tcsetpgrp(fd, pg)設定與終端fd(一個由os.open()返回的開啟的檔案描述符)關聯的進程組為pg。os.tempnam([dir[, prefix]])Python3 中已刪除。返回唯一的路徑名用於建立臨時檔案。os.tmpfile()Python3 中已刪除。返回一個開啟的模式為(w+b)的檔案對象 .這檔案對象沒有檔案夾入口,沒有檔案描述符,將會自動刪除。os.tmpnam()Python3 中已刪除。為建立一個臨時檔案返回一個唯一的路徑os.ttyname(fd)返回一個字串,它表示與檔案描述符fd 關聯的終端裝置。如果fd 沒有與終端裝置關聯,則引發一個異常。os.unlink(path)刪除檔案路徑os.utime(path, times)返回指定的path檔案的訪問和修改的時間。os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])輸出在檔案夾中的檔案名稱。通過在樹中遊走,向上或者向下。os.write(fd, str)寫入字串到檔案描述符 fd中. 返回實際寫入的字串長度

來自:http://www.runoob.com/python3/python3-os-file-methods.html

8.sys模組
import  sys# 返回一個列表, 第一個元素為當前檔案名稱print(sys.argv)print(sys.argv[0])# 如果擷取指令碼傳入的第n個參數, sys.argv[n]

批量變更檔名

# 建立目錄img,在此目錄下隨機產生100個以.png結尾的檔案,然後把以.png結尾的檔案改成以.jpg結尾import os,random,string,sys# 建立目錄並隨機產生.png檔案os.mkdir(‘img‘)for i in range(100):    os.mknod(‘img/‘+‘‘.join(random.sample(string.ascii_letters+string.digits,4))+‘.png‘)def modify_suffix(dirname,old_suffix,new_suffix):    if not os.path.exists(dirname):        print(‘目錄不存在!‘)        exit()    old_suffix_file_list = list(filter(lambda x:x.endswith(old_suffix),os.listdir(dirname)))    #字串方法:    #new_suffix_file_list = []    # for i in old_suffix_file_list:    #     new_suffix_file_list.append(i.replace(old_suffix,new_suffix))    # print(new_suffix_file_list)    # for i,j in zip(old_suffix_file_list,new_suffix_file_list):    #     print(dirname+i,dirname+j)    #     os.rename(dirname+‘/‘+i,dirname+‘/‘+j)    #檔案操作方法:    file_name = [os.path.splitext(name)[0] for name in old_suffix_file_list]    for i in file_name:        os.rename(dirname+‘/‘+i+old_suffix,dirname+‘/‘+i+new_suffix)modify_suffix(‘img‘,‘.png‘,‘.jpg‘)

Python學習—檔案操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.