文件路徑python
文件有兩個關鍵屬性:「文件名」和「路徑」。路徑指明瞭文件在計算機上的位置。mysql
在windows上,路徑書寫使用倒斜槓做爲文件夾之間的分隔符。但在OS X和Linux上,使用正斜槓做爲它們的路徑分隔符。若是想要程序運行在全部操做系統上,在編寫python腳本時,必須處理這兩種狀況。sql
若是將單個文件和路徑上的文件夾名稱的字符串傳遞給os.path.join()函數,它會返回一個文件路徑的字符串,包含正確的路徑分隔符。windows
>>> import os >>> os.path.join('usr','local','src','mysql') 'usr/local/src/mysql'
全部沒有從根文件夾開始的文件名或路徑,都假定在當前工做目錄下。利用os.getcwd()函數,能夠取得當前工做路徑的字符串,並能夠利用os.chdir()改變它。bash
若是要更改的當前工做目錄不存在,python就會顯示一個錯誤。ssh
>>> import os >>> os.getcwd() '/root' >>> os.chdir('/usr/local/') >>> os.getcwd() '/usr/local'
能夠用os.makedirs()函數建立新目錄。它會建立全部必要的中間文件夾,目的是確保完整路徑名存在。tcp
>>> import os >>> os.makedirs('/tmp/newdir')
絕對路徑和相對路徑編輯器
▎有兩種方法指定一個文件路徑:ide
「絕對路徑」,老是從根文件夾開始。函數
「相對路徑」,它相對於程序的當前工做目錄。
"."用做文件夾目錄名稱時,是「這個目錄」的縮寫。
".."的意思是父文件夾。
>>> os.getcwd() '/usr/local' >>> os.chdir('./src') >>> os.getcwd() '/usr/local/src'
os.path模塊
os.path模塊包含了許多與文件名和文件路徑相關的有用函數。由於os.path是os模塊中的模塊,因此只要執行import os就能夠導入它。
os.path模塊提供了一些函數,返回一個相對路徑的絕對路徑,以及檢查給定的路徑是否爲絕對路徑。
調用os.path.abspath(path)將返回參數的絕對路徑的字符串。這是將相對路徑轉換爲絕對路徑的簡便方法。
調用os.path.isabs(path),若是參數是1絕對路徑,就返回True,若是參數是一個相對路徑,就返回False。
調用os.path.relpath(path,start)將返回從start路徑到path的相對路徑的字符串。若是沒有提供start,就使用當前工做目錄爲開始路徑。
>>> os.path.abspath('./src') '/usr/local/src' >>> os.path.isabs('./src') False >>> os.path.relpath('/tmp/') '../../tmp'
調用os.path.dirname(path)將返回一個字符串,它包含path參數中最後一個斜槓以前的全部內容。
調用os.path.basename(path)將返回一個字符串,它包含path參數中最後一個斜槓以後的全部內容。
若是同時須要一個路徑的目錄名稱和基本名稱,就能夠調用os.path.split(),得到這兩個字符串的元組。
os.path.split()不會接受一個文件路徑並返回每一個文件夾的字符串的列表。
split()字符串方法將返回一個列表,包含該路徑的全部部分。若是向它傳遞os.path.sep,就能在全部操做系統上工做。
>>> os.path.dirname('/usr/local/src/mysql') '/usr/local/src' >>> os.path.basename('/usr/local/src/mysql') 'mysql' >>> os.path.split('/usr/local/src/mysql') ('/usr/local/src', 'mysql')
調用os.path.getsize(path)將返回path參數中文件的字節數。
調用os.listdir(path)將返回文件名字符串的列表,包含path參數中的每一個文件。
>>> import os >>> os.path.getsize('/tmp/1.txt') 1100 >>> os.listdir('/tmp/') ['.font-unix', '.X11-unix', '.ICE-unix', '.Test-unix', '.XIM-unix', 'py.py', 'bigfile', 'yum_save_tx.2017-07-20.09-37.LxNivf.yumtx', 'newdir', '1.txt']
os.path模塊提供了一些函數,用於檢測給定的路徑是否存在,以及它是文件仍是文件夾。
若是path參數所指的文件或文件夾存在,調用os.path.exists(path)將返回True,不然返回False。
若是path參數存在,而且是一個文件,調用os.path.isfile(path)將返回True,不然返回False。
若是path參數存在,而且是一個文件夾,調用os.path.isdir(path)將返回True,不然返回False。
利用os.path.exists()函數,能夠肯定DVD或閃存盤當前是否連在計算機上。
>>> os.path.exists('/tmp/1.txt') True >>> os.path.isfile('/tmp/1.txt') True >>> os.path.isdir('/tmp/1.txt') False
文件讀寫過程
「純文本文件」只包含基本文本字符,不包含字體、大小和顏色信息。
「二進制文件」是全部其餘文件類型,諸如字處理文檔、PDF、圖像、電子表格和可執行程序。
▎在python中,讀寫文件有3個步驟:
一、調用open()函數,返回一個File對象。
二、調用File對象的read()或write()方法。
三、調用File對象的close()方法,關閉該文件。
在python中打開文件時,讀模式是默認的模式。「r」表示讀模式,「w」表示寫模式,「a」表示添加模式。
若是傳遞給open()的文件名不存在,寫模式和添加模式都會建立一個新的空文件。在讀取或寫入文件後,調用close()方法,而後才能再次打開該文件。
若是將文件內容當作是單個大字符串,read()方法就返回保存在該文件中的這個字符串。
也可使用readlines()方法,從文件取得一個字符串的列表。列表中每一個字符串就是文本的每一行。
write()方法不會像print()函數1,在字符串的末尾自動添加換行字符。必須本身添加該字符。
>>> readfile=open('/tmp/1.txt') >>> txt=readfile.read() >>> txt '123~112313213\nroot:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\ngames:x:12:100:games:/usr/games:/sbin/nologin\nftp:x:14:50:FTP User:/var/ftp:/sbin/nologin\nnobody:x:99:99:Nobody:/:/sbin/nologin\nsystemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin\nsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin\ndbus:x:81:81:System message bus:/:/sbin/nologin\npolkitd:x:998:997:User for polkitd:/:/sbin/nologin\ntss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin\nsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin\npostfix:x:89:89::/var/spool/postfix:/sbin/nologin\nchrony:x:997:995::/var/lib/chrony:/sbin/nologin\ntcpdump:x:72:72::/:/sbin/nologin\njuispan:x:1000:1000::/home/juispan:/bin/bash\n' >>> readfile.close()
保存變量
利用shelve模塊,能夠將python程序中的變量保存到二進制的shelf文件中。這樣,程序就能夠從硬盤中恢復變量的數據。
shelve模塊自動將對象pickle進和pickle出,等於在程序中添加「保存」和「打開」功能。
shelf值沒必要用讀模式或寫模式打開,由於它們在打開後,既能讀又能寫。
shelve系統自動分隔存儲記錄,而且只獲取和更新被訪問和修改的記錄。
像字典同樣,shelf值有keys()和values()方法。會返回相似列表的值,而不是真正的列表。
>>> import shelve >>> shelFile=shelve.open('mydata') >>> price=[1,2,3] >>> shelFile['price']=price >>> shelFile.close() >>> shelFile=shelve.open('mydata') >>> type(shelFile) <class 'shelve.DbfilenameShelf'> >>> list(shelFile.keys()) ['price'] >>> list(shelFile.values()) [[1, 2, 3]] >>> shelFile['price'] [1, 2, 3] >>> shelFile.close()
能夠用pprint.pformat()函數保存變量。
import語句導入的模塊自己就是python腳本。
>>> import pprint >>> price=[1,2,3,4,5] >>> pprint.pformat(price) '[1, 2, 3, 4, 5]' >>> pFile=open('pprice.py','w') >>> pFile.write(pprint.pformat(price)) 15 >>> pFile.close()
經過導入pprice.py模塊可以查看到文件內容。建立一個.py文件的好處在於,由於它是一個文本文件,因此任何人均可以用一個簡單的文本編輯器讀取和修改文件的內容。可是,對於大多數應用,利用shelve模塊來保存數據,是將變量保存到文件的最佳方式。只有基本數據類型,諸如整型、浮點型、字符串、列表和字典,能夠做爲簡單文本寫入一個文件。