溫馨提示×

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

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

Python學(xué)習(xí)—文件操作

發(fā)布時(shí)間:2020-08-16 16:51:34 來源:網(wǎng)絡(luò) 閱讀:563 作者:長安223 欄目:編程語言

1.文件基礎(chǔ)知識(shí)

1.文件是存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合,文件的基本單位是字節(jié),文件所含的字節(jié)數(shù)就是文件的長度。每個(gè)字節(jié)都有一個(gè)默認(rèn)的位置,位置從0開始,文件頭的位置就是0,文件尾的位置是文件內(nèi)容結(jié)束后的后一個(gè)位置,該位置上沒有文件內(nèi)容,為空。文件的讀寫操作從文件指針?biāo)诘奈恢瞄_始,即讀會(huì)從文件指針?biāo)诘奈恢瞄_始讀取,寫會(huì)從文件指針?biāo)诘奈恢瞄_始寫,如有內(nèi)容,則會(huì)被覆蓋。
2.按文件中數(shù)據(jù)的組織形式把文件分為文本文件和二進(jìn)制文件兩類。文本文件存儲(chǔ)的是常規(guī)字符串,由文本行組成,通常以換行符'\n'結(jié)尾,只能讀寫常規(guī)字符串。文本文件可以用字處理軟件如gedit、記事本等進(jìn)行查看編輯。常規(guī)字符串是指文本編輯器能正常顯示、編輯的字符串,如英文字母串、漢字串、數(shù)字串。二進(jìn)制文件把對(duì)象在內(nèi)存中的內(nèi)容以字節(jié)串(bytes)的形式進(jìn)行存儲(chǔ)。不能用字處理軟件進(jìn)行編輯。

2.文件的打開或創(chuàng)建

格式:文件變量名 = open(文件名[,打開方式[,緩沖區(qū)]])

文件名指定被打開文件對(duì)象
打開方式指定文件打開后能進(jìn)行的處理方式
緩沖區(qū)制定了讀寫文件的緩存模式。0表示不緩存,1表示緩存,如大余1則表示緩沖區(qū)的大小。默認(rèn)值為1
open()函數(shù)返回一個(gè)文件對(duì)象,通過該對(duì)象可以對(duì)文件進(jìn)行各種操作

1.普通文本文件

r:
    - 只能讀,不能寫
    - 讀取的文件不存在, 報(bào)錯(cuò) 
    - 報(bào)錯(cuò)信息:FileNotFoundError: [Errno 2] No such file or directory:xxxxxx
r+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,報(bào)錯(cuò)
    - 默認(rèn)情況下,從文件指針?biāo)谖恢瞄_始寫入

w:
    - 只能寫,不能讀
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 會(huì)清空文件內(nèi)容
w+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 會(huì)清空文件內(nèi)容

a:
    - 只能寫,不能讀
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 不會(huì)清空文件內(nèi)容
a+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 不會(huì)清空文件內(nèi)容

2.二進(jìn)制文件:打開方式在普通文本文件上加'b'

rb:
    - 只能讀,不能寫
    - 讀取的文件不存在,報(bào)錯(cuò)
rb+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,報(bào)錯(cuò)
    - 默認(rèn)情況下,從文件指針?biāo)谖恢瞄_始寫入

wb:
    - 只能寫,不能讀
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 會(huì)清空文件內(nèi)容
wb+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 會(huì)清空文件內(nèi)容

ab:
    - 只能寫,不能讀
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 不會(huì)清空文件內(nèi)容
ab+:
    - 可以執(zhí)行讀寫操作
    - 文件不存在,不報(bào)錯(cuò),自動(dòng)創(chuàng)建文件并打開
    - 不會(huì)清空文件內(nèi)容

3.文件常用方法

一、讀
f.next()    #在文件使用迭代器時(shí)會(huì)使用到,在循環(huán)中,next()方法會(huì)在每次循環(huán)中調(diào)用,該方法返回文件的下一行,如果到達(dá)結(jié)尾(EOF),則觸發(fā) StopIteration
f.read([size])    #方法用于從文件讀取指定的字節(jié)數(shù),如果未給定或?yàn)樨?fù)則讀取所有。
f.readline([size])    #從文件讀取整行,包括 "\n" 字符。如果指定了一個(gè)非負(fù)數(shù)的參數(shù),則返回指定大小的字節(jié)數(shù),包括 "\n" 字符。
f.readlines([size])    #讀取所有行(直到結(jié)束符 EOF)并返回列表,該列表可以由 Python 的 for... in ... 結(jié)構(gòu)進(jìn)行處理。如果碰到結(jié)束符 EOF 則返回空字符串。,若給定sizeint>0,則是設(shè)置一次讀多少字節(jié),這是為了減輕讀取壓力

二、寫
f.write([str])    #用于向文件中寫入指定字符串
f.writelines(sequence_of_strings)    #向文件中寫入一序列的字符串

三、其他操作
f.flush()    #用來刷新緩沖區(qū)的,即將緩沖區(qū)中的數(shù)據(jù)立刻寫入文件,同時(shí)清空緩沖區(qū),不需要是被動(dòng)的等待輸出緩沖區(qū)寫入  
f.seek(offset[, whence])    #于移動(dòng)文件讀取指針到指定位置
       offset -- 開始的偏移量,也就是代表需要移動(dòng)偏移的字節(jié)數(shù)
       whence -- 可選,默認(rèn)值為 0。給offset參數(shù)一個(gè)定義,表示要從哪個(gè)位置開始偏移;0代表從文件開頭開始算起,1代表從當(dāng)前位開始算起,2代表從文件末尾算起。 
f.tell()    #返回文件指針當(dāng)前位置
f.truncate([ size ])    #截?cái)辔募绻付丝蛇x參數(shù) size,則表示截?cái)辔募?size 個(gè)字符。 如果沒有指定 size,則從當(dāng)前位置起截?cái)啵唤財(cái)嘀?size 后面的所有字符被刪除。
f.close()    #用于關(guān)閉一個(gè)已打開的文件          
f.closed    #返回true如果文件已被關(guān)閉,否則返回false。
f.fileno()    #方法返回一個(gè)整型的文件描述符(file descriptor FD 整型),可用于底層操作系統(tǒng)的 I/O 操作。
f.isatty()    #檢測(cè)文件是否連接到一個(gè)終端設(shè)備,如果是返回 True,否則返回 False

四、以下兩個(gè)屬性在python2中有,在python3中已經(jīng)被刪除了
f.mode    #返回被打開文件的訪問模式。
f.name    # 返回文件的名稱。

4.安全上下文with

上下文管理器:打開文件, 執(zhí)行完with語句內(nèi)容之后, 自動(dòng)關(guān)閉文件對(duì)象

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

同時(shí)打開兩個(gè)文件對(duì)象( python2中不支持)

with    open('/tmp/passwd') as f1, open('/tmp/passwdBack', 'w+') as f2:
    # 將第一個(gè)文件的內(nèi)容寫入第二個(gè)文件中,文件復(fù)制即使如此。
    f2.write(f1.read())
    # 移動(dòng)指針移動(dòng)到文件最開始
    f2.seek(0,0)
    # 讀取指針內(nèi)容
    print(f2.read())

python2中只能這么實(shí)現(xiàn)

with open('/tmp/passwd') as f1:
    content = f1.read()
with open('/tmp/passwdBack', 'w+'):
    f2.write(content)

5.yield實(shí)現(xiàn)讀取大文件

# 1. 文件操作
   1). 創(chuàng)建文件data.txt, 文件共100000行, 每行存放一個(gè)1~100之間的整數(shù).
   2). 找出文件中數(shù)字出現(xiàn)次數(shù)最多的10個(gè)數(shù)字, 寫入文件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, 每次讀取一行進(jìn)行處理
 def byLineReader(filename):
     with open(filename) as f:
         line = f.readline()
         # 如果可以讀取到內(nèi)容, 返回該行信息
         while line:
             yield  line
             line = f.readline()

# read是一個(gè)生成器對(duì)象,
 read = byLineReader('data.txt')
 print(read)

# #1). next 讀取生成器的內(nèi)容
 print(next(read))
 print(next(read))
 ...

# #2). 通過for循環(huán)
 for item in read:
     print(item)

# ******** 文件對(duì)象是可以for循環(huán)遍歷的, 默認(rèn)遍歷的內(nèi)容為每一行的內(nèi)容.是節(jié)省內(nèi)存空間的。
from collections import Iterable

f = 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). 返回操作系統(tǒng)類型, 值為posix,是Linux操作系統(tǒng), 值為nt, 是windows操作系統(tǒng)
print(os.name)
print('Linux' if os.name=='posix' else 'Windows')

# 2). 操作系統(tǒng)的詳細(xì)信息
info = os.uname()
print(info)
print(info.sysname)
print(info.nodename)

# 3). 系統(tǒng)環(huán)境變量
print(os.environ)

# 4). 通過key值獲取環(huán)境變量對(duì)應(yīng)的value值
print(os.environ.get('PATH'))
print(os.getenv('PATH'))

遍歷指定目錄下所有內(nèi)容

import os
from os.path import join

for 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)
檢驗(yàn)權(quán)限模式

os.chdir(path)
改變當(dāng)前工作目錄

os.chflags(path, flags)
設(shè)置路徑的標(biāo)記為數(shù)字標(biāo)記。

os.chmod(path, mode)
更改權(quán)限

os.chown(path, uid, gid)
更改文件所有者

os.chroot(path)
改變當(dāng)前進(jìn)程的根目錄

os.close(fd)
關(guān)閉文件描述符 fd

os.closerange(fd_low, fd_high)
關(guān)閉所有文件描述符,從 fd_low (包含) 到 fd_high (不包含), 錯(cuò)誤會(huì)忽略

os.dup(fd)
復(fù)制文件描述符 fd

os.dup2(fd, fd2)
將一個(gè)文件描述符 fd 復(fù)制到另一個(gè) fd2

os.fchdir(fd)
通過文件描述符改變當(dāng)前工作目錄

os.fchmod(fd, mode)
改變一個(gè)文件的訪問權(quán)限,該文件由參數(shù)fd指定,參數(shù)mode是Unix下的文件訪問權(quán)限。

os.fchown(fd, uid, gid)
修改一個(gè)文件的所有權(quán),這個(gè)函數(shù)修改一個(gè)文件的用戶ID和用戶組ID,該文件由文件描述符fd指定。

os.fdatasync(fd)
強(qiáng)制將文件寫入磁盤,該文件由文件描述符fd指定,但是不強(qiáng)制更新文件的狀態(tài)信息。

os.fdopen(fd[, mode[, bufsize]])
通過文件描述符 fd 創(chuàng)建一個(gè)文件對(duì)象,并返回這個(gè)文件對(duì)象

os.fpathconf(fd, name)
返回一個(gè)打開的文件的系統(tǒng)配置信息。name為檢索的系統(tǒng)配置的值,它也許是一個(gè)定義系統(tǒng)值的字符串,這些名字在很多標(biāo)準(zhǔn)中指定(POSIX.1, Unix 95, Unix 98, 和其它)。

os.fstat(fd)
返回文件描述符fd的狀態(tài),像stat()。

os.fstatvfs(fd)
返回包含文件描述符fd的文件的文件系統(tǒng)的信息,像 statvfs()

os.fsync(fd)
強(qiáng)制將文件描述符為fd的文件寫入硬盤。

os.ftruncate(fd, length)
裁剪文件描述符fd對(duì)應(yīng)的文件, 所以它最大不能超過文件大小。

os.getcwd()
返回當(dāng)前工作目錄

os.getcwdu()
返回一個(gè)當(dāng)前工作目錄的Unicode對(duì)象

os.isatty(fd)
如果文件描述符fd是打開的,同時(shí)與tty(-like)設(shè)備相連,則返回true, 否則False。

os.lchflags(path, flags)
設(shè)置路徑的標(biāo)記為數(shù)字標(biāo)記,類似 chflags(),但是沒有軟鏈接

os.lchmod(path, mode)
修改連接文件權(quán)限

os.lchown(path, uid, gid)
更改文件所有者,類似 chown,但是不追蹤鏈接。

os.link(src, dst)
創(chuàng)建硬鏈接,名為參數(shù) dst,指向參數(shù) src

os.listdir(path)
返回path指定的文件夾包含的文件或文件夾的名字的列表。

os.lseek(fd, pos, how)
設(shè)置文件描述符 fd當(dāng)前位置為pos, how方式修改: SEEK_SET 或者 0 設(shè)置從文件開始的計(jì)算的pos; SEEK_CUR或者 1 則從當(dāng)前位置計(jì)算; os.SEEK_END或者2則從文件尾部開始. 在unix,Windows中有效

os.lstat(path)
像stat(),但是沒有軟鏈接

os.major(device)
從原始的設(shè)備號(hào)中提取設(shè)備major號(hào)碼 (使用stat中的st_dev或者st_rdev field)。

os.makedev(major, minor)
以major和minor設(shè)備號(hào)組成一個(gè)原始設(shè)備號(hào)

os.makedirs(path[, mode])
遞歸文件夾創(chuàng)建函數(shù)。像mkdir(), 但創(chuàng)建的所有intermediate-level文件夾需要包含子文件夾。

os.minor(device)
從原始的設(shè)備號(hào)中提取設(shè)備minor號(hào)碼 (使用stat中的st_dev或者st_rdev field )。

os.mkdir(path[, mode])
以數(shù)字mode的mode創(chuàng)建一個(gè)名為path的文件夾.默認(rèn)的 mode 是 0777 (八進(jìn)制)。

os.mkfifo(path[, mode])
創(chuàng)建命名管道,mode 為數(shù)字,默認(rèn)為 0666 (八進(jìn)制)

os.mknod(filename[, mode=0600, device])
創(chuàng)建一個(gè)名為filename文件系統(tǒng)節(jié)點(diǎn)(文件,設(shè)備特別文件或者命名pipe)。

os.open(file, flags[, mode])
打開一個(gè)文件,并且設(shè)置需要的打開選項(xiàng),mode參數(shù)是可選的

os.openpty()
打開一個(gè)新的偽終端對(duì)。返回 pty 和 tty的文件描述符。

os.pathconf(path, name)
返回相關(guān)文件的系統(tǒng)配置信息。

os.pipe()
創(chuàng)建一個(gè)管道. 返回一對(duì)文件描述符(r, w) 分別為讀和寫

os.popen(command[, mode[, bufsize]])
從一個(gè) command 打開一個(gè)管道

os.read(fd, n)
從文件描述符 fd 中讀取最多 n 個(gè)字節(jié),返回包含讀取字節(jié)的字符串,文件描述符 fd對(duì)應(yīng)文件已達(dá)到結(jié)尾, 返回一個(gè)空字符串。

os.readlink(path)
返回軟鏈接所指向的文件

os.remove(path)
刪除路徑為path的文件。如果path 是一個(gè)文件夾,將拋出OSError; 查看下面的rmdir()刪除一個(gè) directory。

os.removedirs(path)
遞歸刪除目錄。

os.rename(src, dst)
重命名文件或目錄,從 src 到 dst

os.renames(old, new)
遞歸地對(duì)目錄進(jìn)行更名,也可以對(duì)文件進(jìn)行更名。

os.rmdir(path)
刪除path指定的空目錄,如果目錄非空,則拋出一個(gè)OSError異常。

os.stat(path)
獲取path指定的路徑的信息,功能等同于C API中的stat()系統(tǒng)調(diào)用。

os.stat_float_times([newvalue])
決定stat_result是否以float對(duì)象顯示時(shí)間戳

os.statvfs(path)
獲取指定路徑的文件系統(tǒng)統(tǒng)計(jì)信息

os.symlink(src, dst)
創(chuàng)建一個(gè)軟鏈接

os.tcgetpgrp(fd)
返回與終端fd(一個(gè)由os.open()返回的打開的文件描述符)關(guān)聯(lián)的進(jìn)程組

os.tcsetpgrp(fd, pg)
設(shè)置與終端fd(一個(gè)由os.open()返回的打開的文件描述符)關(guān)聯(lián)的進(jìn)程組為pg。

os.tempnam([dir[, prefix]])
Python3 中已刪除。返回唯一的路徑名用于創(chuàng)建臨時(shí)文件。

os.tmpfile()
Python3 中已刪除。返回一個(gè)打開的模式為(w+b)的文件對(duì)象 .這文件對(duì)象沒有文件夾入口,沒有文件描述符,將會(huì)自動(dòng)刪除。

os.tmpnam()
Python3 中已刪除。為創(chuàng)建一個(gè)臨時(shí)文件返回一個(gè)唯一的路徑

os.ttyname(fd)
返回一個(gè)字符串,它表示與文件描述符fd 關(guān)聯(lián)的終端設(shè)備。如果fd 沒有與終端設(shè)備關(guān)聯(lián),則引發(fā)一個(gè)異常。

os.unlink(path)
刪除文件路徑

os.utime(path, times)
返回指定的path文件的訪問和修改的時(shí)間。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
輸出在文件夾中的文件名。通過在樹中游走,向上或者向下。

os.write(fd, str)
寫入字符串到文件描述符 fd中. 返回實(shí)際寫入的字符串長度

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

8.sys模塊

import  sys
# 返回一個(gè)列表, 第一個(gè)元素為當(dāng)前文件名
print(sys.argv)
print(sys.argv[0])
# 如果獲取腳本傳入的第n個(gè)參數(shù), sys.argv[n]

批量更改文件名

# 創(chuàng)建目錄img,在此目錄下隨機(jī)生成100個(gè)以.png結(jié)尾的文件,然后把以.png結(jié)尾的文件改成以.jpg結(jié)尾
import os,random,string,sys

# 創(chuàng)建目錄并隨機(jī)生成.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')
向AI問一下細(xì)節(jié)

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

AI