中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

19文件IO_io_pathlib_shutil

發布時間:2020-07-21 12:24:18 來源:網絡 閱讀:251 作者:chaijowin 欄目:編程語言

?

?

目錄

StringIOBytesIO... 1

路徑操作,pathlib... 2

OS模塊:... 10

shutil模塊:... 13

文件拷貝:... 13

rm.. 14

mv. 14

?

?

?

StringIOBytesIO

?

StringIO

io模塊中的類;

from io import StringIO

內存中,開辟的一個文本模式的buffer,可以像文件對象一樣操作它(僅在內存中,在內存中構建文件);

close()方法被調用的時候,這個buffer會被釋放;

sio=StringIO();sio.getvalue(),獲取全部內容,跟文件指針沒有關系,無視指針,輸出全部內容;

好處,一般來說,磁盤的操作比內存的操作要慢得多,內存足夠的情況下,一般的優化思路是少落地,減少磁盤IO的過程,可以大大提高程序的運行效率;

通常解決方案,單機用StringIO,多機分布式用redis

?

BytesIO

io模塊中的類;

from io import BytesIO

內存中,開辟的一個二進制模式的buffer,可以像文件對象一樣操作它;

close()方法被調用的時候,這個buffer會被釋放;

?

file-like對象:

類文件對象,可以像文件對象一樣操作;

socket對象、輸入輸出對象(stdinstdout),都是類文件對象;

unixOS一樣,一切皆文件;

?

例:

In [63]: from io import StringIO

In [64]: sio = StringIO()

In [65]: print(sio.readable(),sio.writable(),sio.seekable())

True True True

In [66]: sio.write('magedu\npython')

Out[66]: 13

In [67]: sio.seek(0)

Out[67]: 0

In [68]: sio.readline()

Out[68]: 'magedu\n'

In [69]: sio.readline()

Out[69]: 'python'

In [70]: sio.getvalue()?? #無視指針,輸出全部內容,相當于sio.seek(0);sio.read()

Out[70]: 'magedu\npython'

In [71]: sio.close()

?

例:

In [72]: from io import BytesIO

In [73]: bio=BytesIO()

In [74]: print(bio.readable(),bio.writable(),bio.seekable())

True True True

In [75]: bio.write('magedu\npython'.encode())

Out[75]: 13

In [76]: bio.seek(0)

Out[76]: 0

In [77]: bio.readlines()

Out[77]: [b'magedu\n', b'python']

In [78]: bio.getvalue()

Out[78]: b'magedu\npython'

In [79]: bio.close()

?

例:

In [80]: from sys import stdout

In [81]: f=stdout

In [82]: type(f)

Out[82]: _io.TextIOWrapper

In [83]: f

Out[83]: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>

In [84]: f.write('magedu.com')?? #import sys;sys.stdout.write('magedu.com')print('magedu.com)print也是調用控制臺(標準輸出)打印

Out[84]: magedu.com

?

?

?

路徑操作,pathlib

3.4版本之前用os.pathfrom os import path

os.path.join('/etc/','sysconfig','network')

os.path.exists(p)

os.path.abspath(p)

os.path.dirname(p)

os.path.basename(p)

os.path.split(p)-->(head,tail),返回二元組,headdirnametailbasename

os.path.splitdrive(p)-->(head,tail),僅win下用,取驅動器;

?

例:

In [1]: from os import path

In [2]: p=path.join('/etc','sysconfig','network')?? #os.path后的方法是操作字符串

In [3]: p

Out[3]: '/etc/sysconfig/network'

In [4]: type(p)?? #字符串對象

Out[4]: str

In [5]: path.exists(p)

Out[5]: True

In [6]: path.split(p)

Out[6]: ('/etc/sysconfig', 'network')

In [7]: path.abspath('.')

Out[7]: '/home/python/magedu/projects/cmdb'

?

win下:

19文件IO_io_pathlib_shutil

注:

win下識別/\,最好用r'c:\nt'

linux下僅識別/

?

3.4版本開始,更加的面向對象:

pathlib模塊,建議使用;

from pathlib import Path?? #提供Path對象,來操作目錄和文件,第一個字母大寫(大駝峰);

p=Path()

p.absolute()

p.joinpath('subpath2','subpath3')

p /= 'subpath2' / 'subpath3'

p.exists()

?

路徑拼接:

方一:

操作符/

Path對象 / Path對象;

Path對象 / 字符串;

字符串 / Path對象;

方二:

p.joinpath(*other),連接多個字符串到Path對象中;

方三:

p.absolute().joinpath('subpath2','subpath3') / 字符串或Path對象

?

路徑分解:

p.parts?? #parts屬性,可以返回路徑中的每一個部分;

p.absolute().parts

?

獲取路徑:

str(p)?? #獲取路徑字符串;

bytes(p)?? #獲取路徑字符串的bytes

?

父目錄:

p.parent?? #目錄的邏輯父目錄,常用于獲取某個文件的路徑;相對路徑的父目錄要先轉絕對路徑,不轉絕對路徑父目錄是其本身;

p.parent.parent?? #到頭后,不報錯;

p.parents?? #父目錄序列,索引0是直接的父;逐級到根(從長到短);

?

p.name,目錄的最后一個部分;

p.stem,目錄最后一個部分,沒有后綴;

p.suffix,目錄最后一個部分的擴展名;

p.suffixes,返回多個擴展名列表;

p.with_suffix(suffix)-->新路徑,補充擴展名到路徑尾部,返回新的路徑,擴展名存在則無效;

p.with_name(name)-->新路徑,替換目錄最后一個部分,并返回一個新的路徑;相當于p = p.parent / 'name'

?

完整路徑兩種:

完整路徑 = p.parent + p.name

完整路徑 = p.parent + p.stem + p.suffix

?

p.cwd(),返回當前工作目錄;

p.home(),返回當前用戶目錄;

?

p.is_dir(),是否是目錄,OS上要有實體;

p.is_file(),是否是普通文件;

p.is_symlink(),是否是軟鏈接;

p.is_socket(),是否是socket文件;

p.is_block_device(),是否是塊設備文件;

p.is_char_device(),是否是字符設備文件;

p.is_absolute(),是否是絕對路徑;

?

p.resolve()-->新路徑,返回一個新路徑,這個新路徑就是當前Path對象的絕對路徑,如果是軟鏈接則直接被解析;

p.absolute(),獲取絕對路徑,推薦使用p.resolve()

?

p.exists(),目錄或文件是否存在;

p.rmdir(),刪除空目錄,沒有提供判斷目錄為空的方法;

p.touch(mode=0o666,exist_ok=True),創建一個文件,0o為八進制;

p.as_uri(),將路徑返回成uri,如file:///etc/hosts

p.mkdir(mode=0o777,parents=False,exist_ok=False)

p.mkdir(parents=True)相當于mkdir -p,若parents=False父目錄不存在則拋FileNotFoundError

exist_ok3.5版本加入,False時路徑存在拋FileExistsErrorTrueFileExistsError被忽略,一般不用此項,寫前用if判斷路徑是否存在;

?

p.iterdir(),迭代當前目錄;

?

p.glob(pattern),通配給定的模式;

p.rglob(pattern),通配給定的模式,recursion遞歸目錄;

p.match(pattern),匹配;

?

p.open(mode='r',buffering=-1,encoding=None,errors=None,newline=None),使用方法同內建函數open(),返回一個文件對象;

?

3.5版增加的新函數:

p.read_text(encoding=None,errors=None)

p.read_bytes(),以rb方式讀取路徑對應文件,并返回二進制流;

p.write_bytes(data),以wb方式寫入數據到路徑對應文件;

p.write_text(data,encoding=None,errors=None),以wt方式寫入字符串到路徑對應文件;

?

?

例:

In [8]: from pathlib import Path

In [9]: p=Path() ??#實例化,當前目錄,同set(),dict(),list()

In [10]: type(p)?? #linux下為pathlib.PosixPathwin下為pathlib.WindowsPath

Out[10]: pathlib.PosixPath

In [11]: p

Out[11]: PosixPath('.')

In [12]: p.absolute()

Out[12]: PosixPath('/home/python/magedu/projects/cmdb')

In [13]: p=p.joinpath('a','b')?? #p=p / 'a' / 'b'

In [14]: p.absolute()

Out[14]: PosixPath('/home/python/magedu/projects/cmdb/a/b')

In [15]: p = p / 'c' / 'd'?? #p /= 'c' / 'd',等號右邊必須要有Path對象p

In [16]: p

Out[16]: PosixPath('a/b/c/d')

In [17]: p.absolute()

Out[17]: PosixPath('/home/python/magedu/projects/cmdb/a/b/c/d')

In [18]: p1=Path('/etctest')?? #初始化絕對路徑,實際不存在

In [19]: p1

Out[19]: PosixPath('/etctest')

In [20]: p1.exists()

Out[20]: False

In [21]: p2=Path()

In [22]: p2=p1 / 'sysconfig'?? #等號右邊必須要有Path對象,不可以p2='/etctest' / 'sysconfig'

In [23]: p2

Out[23]: PosixPath('/etctest/sysconfig')

In [24]: print(p2)?? #p2結果一樣,但調用的函數不一樣,p2作為字符串用時要強制類型轉換str(p2)

/etctest/sysconfig

In [25]: p=Path('a','b','c/d')?? #當前目錄下的a/b/c/d

In [26]: p

Out[26]: PosixPath('a/b/c/d')

In [27]: p=Path('/a','/b','c')?? #錯誤,當前路徑要慎用

In [28]: p?? #路徑為/b/c

Out[28]: PosixPath('/b/c')

In [29]: p.parts

Out[29]: ('/', 'b', 'c')

In [30]: print(str(p),bytes(p))?? #bytes(p)str(p).encode()

/b/c b'/b/c'

?

例:

In [33]: p=Path('/etc/sysconfig/network')

In [34]: p.parent

Out[34]: PosixPath('/etc/sysconfig')

In [35]: p.parent

Out[35]: PosixPath('/etc/sysconfig')

In [36]: p.parent.parent

Out[36]: PosixPath('/etc')

In [37]: p.parent.parent.parent

Out[37]: PosixPath('/')

In [38]: p.parent.parent.parent.parent

Out[38]: PosixPath('/')

In [39]: list(p.parents)

Out[39]: [PosixPath('/etc/sysconfig'), PosixPath('/etc'), PosixPath('/')]

In [40]: list(p.parents)[0]

Out[40]: PosixPath('/etc/sysconfig')

In [41]: next(iter(p.parents))?? #注意超界

Out[41]: PosixPath('/etc/sysconfig')

In [42]: for x in p.parents:

??? ...:???? print(x)

??? ...:????

/etc/sysconfig

/etc

/

In [43]: p=Path()

In [44]: p.parent?? #相對路徑的父目錄是其本身

Out[44]: PosixPath('.')

In [45]: p.absolute().parent?? #相對路徑的父目錄先轉絕對路徑,再查看

Out[45]: PosixPath('/home/python/magedu/projects')

In [46]: p.absolute().parent.parent

Out[46]: PosixPath('/home/python/magedu')

In [48]: for x in p.absolute().parents:

??? ...:???? print(x)

??? ...:????

/home/python/magedu/projects

/home/python/magedu

/home/python

/home

/

?

例:

In [49]: p=Path('/etc/sysconfig/test.txt')

In [50]: p.name

Out[50]: 'test.txt'

In [51]: p.stem

Out[51]: 'test'

In [52]: p.suffix

Out[52]: '.txt'

In [53]: p.suffixes

Out[53]: ['.txt']

In [54]: p2=Path('/etc/sysconfig/test.tar.gz')

In [55]: p2.suffixes

Out[55]: ['.tar', '.gz']

In [56]: p2.with_suffix('.bz2') ??#修改擴展名一定要帶點,原.gz-->.bz2,否則ValueError: Invalid suffix 'bz2';若原擴展名沒點,經此操作是加擴展名

Out[56]: PosixPath('/etc/sysconfig/test.tar.bz2')

In [57]: p2.with_suffix('.tgz')

Out[57]: PosixPath('/etc/sysconfig/test.tar.tgz')

In [58]: p3=Path('/etc/sysconfig/test')

In [59]: p3.with_suffix('.tgz')

Out[59]: PosixPath('/etc/sysconfig/test.tgz')

In [60]: p2.with_name('test') ??#改文件名,同p2 = p2.parent / 'test'

Out[60]: PosixPath('/etc/sysconfig/test')

In [61]: p3.with_name('test.tar.gz')

Out[61]: PosixPath('/etc/sysconfig/test.tar.gz')

In [64]: p3

Out[64]: PosixPath('/etc/sysconfig/test')

In [65]: p3.with_suffix('.tgz')

Out[65]: PosixPath('/etc/sysconfig/test.tgz')

In [67]: p3=p3.parent / 'test.tgz'

In [68]: p3

Out[68]: PosixPath('/etc/sysconfig/test.tgz')

?

例:

In [69]: p=Path('a','b','c/d')

In [70]: p.mkdir(parents=True)

In [71]: p.exists()

Out[71]: True

?

例:

In [1]: from pathlib import Path

In [2]: p=Path()

In [3]: p.iterdir()

Out[3]: <generator object Path.iterdir at 0x7f13d7954d58>

In [4]: p.iterdir()

Out[4]: <generator object Path.iterdir at 0x7f13d7792db0>

In [5]: for x in p.iterdir():

?? ...:???? if x.is_dir():

?? ...:???????? print(x)

?? ...:????????

a

In [6]: p

Out[6]: PosixPath('.')

In [7]: ls

a/? max-min.sh? test? test.txt

?

例:

遍歷,并判斷文件類型,如果是目錄并判斷其是否為空;

from pathlib import Path

?

p = Path('a/b/c/d')

?

for x in p.parents[len(p.parents)-1].iterdir():

??? print(x,end='\t\t\t\t')

??? if x.is_dir():

??????? flag = False

??????? for _ in x.iterdir():

??????????? flag = True

??????????? break

??????? print('dir','Not Empty' if flag else 'Empty',sep='\t\t\t\t')

??? elif x.is_file():

??????? print('file')

??? else:

??????? print('other file')

?

例:

In [24]: p=Path()

In [25]: p

Out[25]: PosixPath('.')

In [27]: p.glob('t*')

Out[27]: <generator object Path.glob at 0x7f8e15a7c570>

In [28]: list(p.glob('t*'))

Out[28]: [PosixPath('test'), PosixPath('test.txt')]

In [30]: list(p.glob('/*.py'))?? #錯誤,p是當前路徑,通配的是/下的文件

---------------------------------------------------------------------------

NotImplementedError?????????????????????? Traceback (most recent call last)

<ipython-input-30-9049ac7c961c> in <module>()

----> 1 list(p.glob('/*.py'))

……

In [31]: list(p.glob('*/*.py'))

Out[31]: []

In [32]: list(p.glob('**/*.py'))?? #**/相對當前的,之后任意級

Out[32]: [PosixPath('pathlib_Path_iterdir.py')]

In [33]: p.resolve()?? #絕對路徑,軟鏈接會追蹤

Out[33]: PosixPath('/home/python/magedu/projects/cmdb')

In [35]: list(p.rglob('*.py'))

Out[35]: [PosixPath('pathlib_Path_iterdir.py')]

In [38]: !touch e/test.py

In [42]: p=Path('e/test.py')

In [43]: p.match('*.py')

Out[43]: True

In [44]: Path('.py').match('*.py')

Out[44]: True

In [45]: Path('a/b/c.py').match('b/*.py')

Out[45]: True

In [46]: Path('a/b/c.py').match('a/*.py')

Out[46]: False

In [47]: Path('a/b/c.py').match('a/*/*.py')

Out[47]: True

In [48]: Path('a/b/c.py').match('a/**/*.py')

Out[48]: True

In [49]: Path('a/b/c.py').match('**/*.py')

Out[49]: True

In [50]: Path('a/c.py').match('a/*/*.py')

Out[50]: False

In [51]: Path('a/c.py').match('a/**/*.py')

Out[51]: False

?

例:

In [52]: p=Path('/tmp/test.txt')

In [53]: p.touch()

In [54]: p.open('w+')

Out[54]: <_io.TextIOWrapper name='/tmp/test.txt' mode='w+' encoding='UTF-8'>

In [55]: with p.open('w+') as f:?? #建議使用with...as...

??? ...:???? f.write('test\ntest')

??? ...:????

In [56]: f

Out[56]: <_io.TextIOWrapper name='/tmp/test.txt' mode='w+' encoding='UTF-8'>

In [57]: f.closed

Out[57]: True

In [58]: p.read_text()

Out[58]: 'test\ntest'

In [59]: p.write_text('abc')?? #每次都會清空再寫,不能傳模式

Out[59]: 3

In [60]: p.read_text()

Out[60]: 'abc'

?

?

?

OS模塊:

os.namewin顯示ntlinux顯示posix

os.uname()win不支持,linux支持;

os.listdir('/tmp'),返回目錄內容列表,是立即返回;

sys.platformwin顯示win32linux顯示linux

?

os.stat(path, *, dir_fd=None, follow_symlinks=True)

調用linux系統的stat

path,路徑的stringbytesfd

follow_symlinks=True默認追蹤,返回文件本身信息,False如果是軟鏈接則顯示軟鏈接本身;

?

os.chmod(path,mode,*,dir_fd=None,follow_symlinks=True)

os.chown(path,uid,gid),改變文件的屬主、屬組、但需要有足夠的權限;

?

注:

os也有openreadwrite等方法,太低級(底層),建議使用內建函數openreadwrite

?

例:

In [61]: import os

In [62]: os.name

Out[62]: 'posix'

19文件IO_io_pathlib_shutil

In [63]: os.uname

Out[63]: <function posix.uname>

In [64]: os.uname()

Out[64]: posix.uname_result(sysname='Linux', nodename='tmsapp', release='2.6.32-431.el6.x86_64', version='#1 SMP Sun Nov 10 22:19:54 EST 2013', machine='x86_64')

In [65]: os.listdir('/tmp')

Out[65]:

['keyring-c8Fi6u',

?'+~JF1728020691866336530.tmp',

?'.X11-unix',

……

In [66]: import sys

In [67]: sys.platform

Out[67]: 'linux'

19文件IO_io_pathlib_shutil

?

例:

]$ ln -sv test.txt t1

`t1' -> `test.txt'

]$ ln -sv test.txt t2

`t2' -> `test.txt'

]$ stat test.txt

? File: `test.txt'

? Size: 66??????? ???????? Blocks: 8????????? IO Block: 4096?? regular file

Device: fd00h/64768d???? Inode: 1448511???? Links: 1

Access: (0664/-rw-rw-r--)? Uid: (? 504/? python)?? Gid: (? 504/? python)

Access: 2018-05-04 06:53:48.943903498 +0800

Modify: 2018-03-14 15:44:32.618152979 +0800

Change: 2018-03-14 15:44:32.628153003 +0800

]$ stat -L t1

? File: `t1'

? Size: 66??????? ???????? Blocks: 8????????? IO Block: 4096?? regular file

Device: fd00h/64768d???? Inode: 1448511???? Links: 1

Access: (0664/-rw-rw-r--)? Uid: (? 504/? python)?? Gid: (? 504/? python)

Access: 2018-05-04 06:53:48.943903498 +0800

Modify: 2018-03-14 15:44:32.618152979 +0800

Change: 2018-03-14 15:44:32.628153003 +0800

]$ stat -L t2

? File: `t2'

? Size: 66??????? ???????? Blocks: 8????????? IO Block: 4096?? regular file

Device: fd00h/64768d???? Inode: 1448511???? Links: 1

Access: (0664/-rw-rw-r--)? Uid: (? 504/? python)?? Gid: (? 504/? python)

Access: 2018-05-04 06:53:48.943903498 +0800

Modify: 2018-03-14 15:44:32.618152979 +0800

Change: 2018-03-14 15:44:32.628153003 +0800

In [1]: import os

In [2]: os.stat('test.txt')

Out[2]: os.stat_result(st_mode=33204, st_ino=1448511, st_dev=64768, st_nlink=1, st_uid=504, st_gid=504, st_size=66, st_atime=1525388028, st_mtime=1521013472, st_ctime=1521013472)

In [3]: os.stat('t1')

Out[3]: os.stat_result(st_mode=33204, st_ino=1448511, st_dev=64768, st_nlink=1, st_uid=504, st_gid=504, st_size=66, st_atime=1525388028, st_mtime=1521013472, st_ctime=1521013472)

In [4]: os.stat('t2')

Out[4]: os.stat_result(st_mode=33204, st_ino=1448511, st_dev=64768, st_nlink=1, st_uid=504, st_gid=504, st_size=66, st_atime=1525388028, st_mtime=1521013472, st_ctime=1521013472)

In [5]: os.stat('t1',follow_symlinks=False)

Out[5]: os.stat_result(st_mode=41471, st_ino=1444349, st_dev=64768, st_nlink=1, st_uid=504, st_gid=504, st_size=8, st_atime=1525415800, st_mtime=1525415780, st_ctime=1525415780)

In [6]: oct(33204)

Out[6]: '0o100664'?? #八進制

In [7]: oct(41471)

Out[7]: '0o120777'

?

?

?

shutil模塊:

高級文件操作;

?

文件拷貝:

打開2個文件對象,源文件讀取內容,寫入目標文件來完成拷貝過程(只內容一樣),這樣會丟失stat數據信息(元數據信息等,包括權限),因為根本沒有復制過去;

import shutil

shutil.copyfileobj(fsrc,fdst[,length=16384]),文件對象的復制,fsrcfdstopen打開的文件對象,復制內容,fdst要求可寫,length表示buffer的大小;

?

shutil.copyfile(src,dst,*,follow_symlinks=True),復制文件內容,不含元數據,src,dst為文件路徑的字符串,本質上調用的是shutil.copyfileobj()不帶元數據二進制內容復制;

?

shutil.copymode(src,dst,*,follow_symlinks=True),僅復制權限;

?

shutil.copystat(src,dst,*,follow_symlinks=True),復制元數據,stat中包含的所有東西,另ctime改不了或不會改;

?

shutil.copy(src,dst,*,follow_symlinks=True),復制文件內容、權限和部分元數據,不包括創建時間和修改時間,本質上調用的是shutil.copyfile()shutil.copymode()

?

shutil.copy2(src,dst,*,follow_symlinks=True),比shutil.copy()多了復制全部元數據,但需要平臺支持,本質上調用的是shutil.copyfile()shutil.copystat()

?

shutil.copytree(src,dst,symlinks=False,ignore=None,copy_function=copy2,ignore_dangling_symlinks=False),遞歸復制目錄,默認使用copy2,即帶更多的元數據復制,

src,dst必須是目錄,src必須存在,dst必須不存在;

ignore=func,提供一個callable(src,names)-->ignored_names函數,它會被調用,src是源目錄,namesos.listdir(src)的結果,即列出src中的文件名,返回值是要被過濾的文件名的set類型數據;

?

?

rm

shutil.rmtree(path,ignore_errors=False,onerror=None)

rm -rf,慎用,遞歸刪除;

它不是原子操作,有可能刪除錯誤就會中斷,但已經刪除的就刪了;

ignore_errorsTrue,忽略錯誤,為FalseOmitted時,onerror生效;

onerrorcallable,接受函數functionpathexecinfo

?

?

mv

shutil.move(src,dst,copy_function=copy2)

遞歸移動文件、目錄到目標,返回目標;

本身使用的是os.rename方法;

如果不支持remove,如果是目錄則是copytree再刪除源目錄;

默認使用copy2方法;

?

shutil還有打包功能,生成tar并壓縮,支持zipgzbz2xz

?

例(理解copytree源碼中ignore(src,names),重要技巧):

def ignore(src,names):

???????? return set(filter(lambda x:x.startswith('t'),names))

lambda src,names:set(filter(lambda x:x.startswith('t'),names))

?

def fn(x,file_names):

???????? return set(filter(lambda x:x.startswith('t'),file_names))

lambda x,file_names:set(filter(lambda x:x.startswith('t'),file_names))

?

注:

重要內建函數:

filter(),過濾;

sorted()

map()zip(),每個元素都動;

?

In [24]: zip(range(5),(1,)*len(range(5)))

Out[24]: <zip at 0x7f9e68a61f48>

In [25]: for item in zip(range(5),(1,)*len(range(5))):

??? ...:???? print(item)

??? ...:????

??? ...:

(0, 1)

(1, 1)

(2, 1)

(3, 1)

(4, 1)

In [26]: map(lambda x:(x,1),range(5))

Out[26]: <map at 0x7f9e685e88d0>

In [27]: for item in map(lambda x:(x,1),range(5)):

??? ...:???? print(item)

??? ...:????

(0, 1)

(1, 1)

(2, 1)

(3, 1)

(4, 1)

?

例:

In [18]: Path('test.txt').write_text('abcde')

Out[18]: 5

In [19]: Path('test.txt').read_text()

Out[19]: 'abcde'

In [20]: with open('test.txt') as f1:

??? ...:???? with open('test_copy.txt','w') as f2:

??? ...:???????? shutil.copyfileobj(f1,f2)

??? ...:????????

In [21]: Path('test_copy.txt').read_text()

Out[21]: 'abcde'

In [22]: with open('test.txt','r+') as f1:?? #錯誤,寫完后文件指針在EOFf2復制的內容為空,一般不在代碼中寫入

??? ...:???? f1.write('abcd\n1234')

??? ...:???? f1.flush()

??? ...:???? with open('test_copy.txt','w') as f2:

??? ...:???????? shutil.copyfileobj(f1,f2)

??? ...:????????

In [23]: Path('test_copy.txt').read_text()

Out[23]: ''

?

?

?

In [3]: shutil.make_archive(r'c:\webproject\mysite\test','gztar','.')?? #壓縮文件名、壓縮格式(bztar|gztar|tar|zip)、壓縮目錄

Out[3]: 'c:\\webproject\\mysite\\test.tar.gz'

?

In [8]: shutil.unpack_archive(r'c:\webproject\mysite\test.tar.gz','e:\\test\\')?? #解壓

?

?

?

tarfile

In [10]: with tarfile.open('test.tar.gz',mode='r:gz') as tf:?? #tarfile.open()返回一個tarfile對象;mode指定壓縮算法,’r:gz’’r:bz2’’w:gz’’w:bz2’

??? ...:???? for member in tf.getmembers():?? #獲取tar包中的文件列表

??? ...:???????? print(member)

??? ...:

<TarInfo '.' at 0x4bf6750>

<TarInfo './blog' at 0x4bf69a8>

<TarInfo './blog/admin.py' at 0x4bf6a70>

<TarInfo './blog/apps.py' at 0x4bf6818>

<TarInfo './blog/forms.py' at 0x4bf6b38>

<TarInfo './blog/migrations' at 0x4bf6cc8>

<TarInfo './blog/migrations/0001_initial.py' at 0x4bf68e0>

<TarInfo './blog/migrations/__init__.py' at 0x4bf6d90>

……

?

In [22]: with tarfile.open(r'c:\webproject\mysite\test.tar.gz',mode='w:gz') as tf:

??? ...:???? tf.add('c:/webproject/mysite')?? #打包

?

In [26]: with tarfile.open('e:/test/test.tar.gz','r:gz') as tf:

...:???? tf.extractall('e:/test/')?? #解壓,extractall解壓所有文件,extract解壓單個文件

?

?

?

zipfile

?

In [28]: import zipfile

?

In [37]: with zipfile.ZipFile('c:/webproject/mysite/tset.zip','w') as tf:

??? ...:???? tf.write('c:/webproject/mysite/db.sqlite3')

?

In [41]: shutil.copy2('c:/webproject/mysite/tset.zip','e:/test/')

Out[41]: 'e:/test/tset.zip'

?

In [42]: with zipfile.ZipFile('e:/test/tset.zip','r') as tf:

??? ...:???? print(tf.namelist())

??? ...:

['webproject/mysite/db.sqlite3']

?

In [45]: with zipfile.ZipFile('e:/test/tset.zip','r') as tf:

??? ...:???? tf.extractall('e:/test/')

...:

?


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汨罗市| 区。| 伊宁市| 阿巴嘎旗| 尼勒克县| 青河县| 蕉岭县| 西丰县| 普洱| 临朐县| 鄂托克前旗| 乐至县| 侯马市| 武穴市| 开阳县| 洱源县| 澎湖县| 玉门市| 道真| 吴旗县| 永胜县| 三亚市| 油尖旺区| 乌兰县| 汶川县| 上虞市| 西城区| 塔城市| 雷波县| 和龙市| 五家渠市| 靖安县| 冀州市| 定边县| 宁国市| 肃北| 新建县| 高清| 邵武市| 南华县| 陇西县|