您好,登錄后才能下訂單哦!
?
?
目錄
StringIO、BytesIO:... 1
路徑操作,pathlib:... 2
OS模塊:... 10
shutil模塊:... 13
文件拷貝:... 13
rm.. 14
mv. 14
?
?
?
?
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對象、輸入輸出對象(stdin,stdout),都是類文件對象;
與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
?
?
?
3.4版本之前用os.path,from 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),返回二元組,head為dirname,tail為basename;
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下:
注:
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_ok,3.5版本加入,False時路徑存在拋FileExistsError,True時FileExistsError被忽略,一般不用此項,寫前用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.PosixPath,win下為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.name,win顯示nt,linux顯示posix;
os.uname(),win不支持,linux支持;
os.listdir('/tmp'),返回目錄內容列表,是立即返回;
sys.platform,win顯示win32,linux顯示linux;
?
os.stat(path, *, dir_fd=None, follow_symlinks=True),
調用linux系統的stat,
path,路徑的string或bytes或fd;
follow_symlinks=True默認追蹤,返回文件本身信息,False如果是軟鏈接則顯示軟鏈接本身;
?
os.chmod(path,mode,*,dir_fd=None,follow_symlinks=True)
os.chown(path,uid,gid),改變文件的屬主、屬組、但需要有足夠的權限;
?
注:
os也有open、read、write等方法,太低級(底層),建議使用內建函數open、read、write;
?
例:
In [61]: import os
In [62]: os.name
Out[62]: 'posix'
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'
?
例:
]$ 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'
?
?
?
高級文件操作;
?
打開2個文件對象,源文件讀取內容,寫入目標文件來完成拷貝過程(只內容一樣),這樣會丟失stat數據信息(元數據信息等,包括權限),因為根本沒有復制過去;
import shutil
shutil.copyfileobj(fsrc,fdst[,length=16384]),文件對象的復制,fsrc和fdst是open打開的文件對象,復制內容,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是源目錄,names是os.listdir(src)的結果,即列出src中的文件名,返回值是要被過濾的文件名的set類型數據;
?
?
shutil.rmtree(path,ignore_errors=False,onerror=None),
同rm -rf,慎用,遞歸刪除;
它不是原子操作,有可能刪除錯誤就會中斷,但已經刪除的就刪了;
ignore_errors為True,忽略錯誤,為False或Omitted時,onerror生效;
onerror為callable,接受函數function、path、execinfo;
?
?
shutil.move(src,dst,copy_function=copy2),
遞歸移動文件、目錄到目標,返回目標;
本身使用的是os.rename方法;
如果不支持remove,如果是目錄則是copytree再刪除源目錄;
默認使用copy2方法;
?
shutil還有打包功能,生成tar并壓縮,支持zip、gz、bz2、xz;
?
例(理解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:?? #錯誤,寫完后文件指針在EOF,f2復制的內容為空,一般不在代碼中寫入
??? ...:???? 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\\')?? #解壓
?
?
?
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解壓單個文件
?
?
?
?
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/')
...:
?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。