1. 程式人生 > >[Python 3系列]讀寫文件

[Python 3系列]讀寫文件

file

文件路徑

文件有兩個關鍵屬性:“文件名”和“路徑”。路徑指明了文件在計算機上的位置。

在windows上,路徑書寫使用倒斜杠作為文件夾之間的分隔符。但在OS X和Linux上,使用正斜杠作為它們的路徑分隔符。如果想要程序運行在所有操作系統上,在編寫python腳本時,必須處理這兩種情況。

如果將單個文件和路徑上的文件夾名稱的字符串傳遞給os.path.join()函數,它會返回一個文件路徑的字符串,包含正確的路徑分隔符。

>>> import os
>>> os.path.join(‘usr‘,‘local‘,‘src‘,‘mysql‘)
‘usr/local/src/mysql‘


所有沒有從根文件夾開始的文件名或路徑,都假定在當前工作目錄下。利用os.getcwd()函數,可以取得當前工作路徑的字符串,並可以利用os.chdir()改變它。

如果要更改的當前工作目錄不存在,python就會顯示一個錯誤。

>>> import os
>>> os.getcwd()
‘/root‘
>>> os.chdir(‘/usr/local/‘)
>>> os.getcwd()
‘/usr/local‘


可以用os.makedirs()函數創建新目錄。它會創建所有必要的中間文件夾,目的是確保完整路徑名存在。

>>> import os
>>> os.makedirs(‘/tmp/newdir‘)


絕對路徑和相對路徑

▎有兩種方法指定一個文件路徑:

“絕對路徑”,總是從根文件夾開始。

“相對路徑”,它相對於程序的當前工作目錄。

"."用作文件夾目錄名稱時,是“這個目錄”的縮寫。

".."的意思是父文件夾。

>>> 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個步驟:

1、調用open()函數,返回一個File對象。

2、調用File對象的read()或write()方法。

3、調用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模塊等於在程序中添加“保存”和“打開”功能。

shelf值不必用讀模式或寫模式打開,因為它們在打開後,既能讀又能寫。

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


本文出自 “技術員修煉手冊” 博客,請務必保留此出處http://juispan.blog.51cto.com/943137/1949918

[Python 3系列]讀寫文件