讀寫文件

文件路徑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模塊來保存數據,是將變量保存到文件的最佳方式。只有基本數據類型,諸如整型、浮點型、字符串、列表和字典,能夠做爲簡單文本寫入一個文件。

相關文章
相關標籤/搜索