1. 程式人生 > >python——讀寫檔案

python——讀寫檔案

檔案有兩個關鍵的熟悉——檔名、路徑

有幾個需要注意的就是:

1.雖然資料夾名稱和檔名在Windows OS X 上是不區分大小寫的,但在Linux 上是區分大小寫的

2.倒斜槓‘\’和正斜槓‘/’  要能夠分清楚(windows使用前者  OS X 以及Linux使用後者)

要使用就需要匯入OS模組

import os

1.os.path.join()——解決跨系統斜槓問題

有一個函式,很好的解決了系統環境的差異問題(其實就是斜槓的不同問題)

os.path.join()函式  將單個檔案和路徑上的文件夾名稱的字串傳遞給它,os.path.join()就會返回一個檔案路徑的字串,包含正

的路徑分隔符。

先來看一個例子:

os.path.join('usr', 'bin', 'spam')

在windows返回'usr\\bin\\spam'(請注意,倒斜槓有兩個,因為每個倒斜槓需要由另一個倒斜槓字元來轉義)。如果我在OS X Linux 上呼叫這個函式,該字串就會是'usr/bin/spam'

如果需要建立檔名稱的字串,os.path.join()函式就很有用。這些字串將傳遞給幾個檔案相關的函式,本章將進行介紹。例如,下面的例子將一個檔名列表中的名稱,新增到資料夾名稱的末尾。

myFiles = ['accounts.txt', 'details.csv', 'invite.docx']

for filename in myFiles:

      print(os.path.join('C:\\Users\\asweigart', filename))

C:\Users\asweigart\accounts.txt

C:\Users\asweigart\details.csv

C:\Users\asweigart\invite.docx

2.當前工作目錄

os.getcwd()——獲取當前工作目錄

os.chdir()——改變當前工作目錄

3.絕對路徑以及相對路徑

有兩種方法指定一個檔案路徑。

“絕對路徑”,總是從根資料夾開始。

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

還有點(.)和點點(..)資料夾。它們不是真正的資料夾,而是可以在路徑中使用的特殊名稱。單個的句點(“點”)用作資料夾目名稱時,是“這個目錄”的縮寫。兩個句點(“點點”)意思是父資料夾。

在path模組中有幾個函式是用來專門處理絕對路徑與相對路徑的

呼叫os.path.abspath(path)將返回引數的絕對路徑的字串。這是將相對路徑轉換為絕對路徑的簡便方法。

呼叫os.path.isabs(path),如果引數是一個絕對路徑,就返回True,如果引數是一個相對路徑,就返回False

呼叫os.path.relpath(path, start)將返回從start 路徑到path 的相對路徑的字串。如果沒有提供start,就使用當前工作目錄作為開始路徑。

4.建立資料夾

os.makedirs() 這個函式會建立所有必要的中間資料夾,目的是確保完整路徑名存在。

5.os.path 模組

之前也有說到過幾個函式,現在再來補充一下幾個經常用到的函式

os.path.dirname(path)將返回一個字串,它包含path 引數中最後一個斜槓之前的所有內容。——目錄名稱

os.path.basename(path)將返回一個字串,它包含path 引數中最後一個斜槓之後的所有內容。——基本名稱

同時需要一個路徑的目錄名稱和基本名稱,就可以呼叫os.path.split(),獲得這兩個字串的元組,——兩者的元組

如果我們需要將每個資料夾分割出來,也就是返回每個資料夾的字串列表

大致意思就是 返回的資料大致是:['C:', 'Windows', 'System32', 'calc.exe']

如果需要這樣,請使用split()字串方法,並根據os.path.sep 中的字串進行分割。回憶一下,根據程式執行的計算機,os.path.sep 變數設定為正確的資料夾分割斜槓。

(其實就是字串的分割  os.path.sep  代表的就是分隔符——斜槓

5.檢視檔案大小

os.path.getsize(path)將返回path 引數中檔案的位元組數。

os.listdir(path)將返回檔名字串的列表,包含path 引數中的每個檔案(請注意,這個函式在os 模組中,而不是os.path)。

6.檢查路徑有效性

如果path 引數所指的檔案或資料夾存在,呼叫os.path.exists(path)將返回True否則返回False。——是否存在

如果path 引數存在,並且是一個檔案,呼叫os.path.isfile(path)將返回True,否則返回False。——檔案

如果path 引數存在,並且是一個資料夾,呼叫os.path.isdir(path)將返回True否則返回False。——資料夾

關於檔案目錄以及檔名的 就先說到這

現在開始來看檔案讀寫的部分了,說到檔案  就需要分清處理什麼檔案了

“純文字檔案”只包含基本文字字元,不包含字體、大小和顏色資訊。帶有.txt 副檔名的文字檔案,以及帶有.py 副檔名的Python 指令碼檔案,都是純文字檔案的例子。它們可以被Windows Notepad OS X TextEdit應用開啟。你的程式可以輕易地讀取純文字檔案的內容,將它們作為普通的字串值。

“二進位制檔案”是所有其他檔案型別,諸如字處理文件、PDF、影象、電子表格和可執行程式。如果用Notepad TextEdit 開啟一個二進位制檔案,它看起來就像亂碼。

我們處理的就是純文字檔案,python在處理(讀寫)檔案的時候,一般就是三個步驟:

1.呼叫open()函式,返回一個File 物件。

2.呼叫File 物件的read()write()方法。

3.呼叫File 物件的close()方法,關閉該檔案。

開啟檔案 python的預設模式是“讀模式”,如果你不希望依賴於Python 的默認值,也可以明確指明該模式,向open()傳入字串'r',作為第二個引數 

‘r’預設模式  只能讀取 ,不能修改檔案內容

‘w’寫模式  覆蓋原有內容(檔案不存在的時候會新建)

‘a’新增模式  在已有檔案的末尾新增文字(檔案不存在的時候會新建)

關於讀檔案,當然不單單一個read()函式

readlines()方法,從該檔案取得一個字串的列表。列表中的每個字串就是文字中的每一行。

關於寫檔案 需要注意一點:write()方法不會像print()函式那樣,在字串的末尾自動新增換行字符。必須自己新增該字元。

下面來說說一個新的模組——shelve

可以將Python 程式中的變數儲存到二進位制的shelf 檔案中。這樣,程式就可以從硬碟中恢復變數的資料。shelve 模組讓你在程式中新增“儲存”和“開啟”功能。例如,如果執行一個程式,並輸入了一些配置設定,就可以將這些設定儲存到一個shelf 檔案,然後讓程式下一次執行時載入它們。

我們就來看下是怎麼使用的

import shelve

shelfFile = shelve.open('mydata')

cats = ['Zophie', 'Pooka', 'Simon']

shelfFile['cats'] = cats

shelfFile.close()

這裡,我們的shelf 值儲存在shelfFile中。我們建立了一個列表cats,並寫下shelfFile['cats'] =cats,將該列表儲存在shelfFile 中,作為鍵'cats'關聯的值(就像在字典中一樣)。

Windows 上執行前面的程式碼,你會看到在當前工作目錄下有3 個新檔案:mydata.bakmydata.dat mydata.dir

OS X 上,只會建立一個mydata.db 檔案。

這些二進位制檔案包含了儲存在shelf 中的資料。這些二進位制檔案的格式並不重要,你只需要知道shelve 模組做了什麼,而不必知道它是怎麼做的。該模組讓你不用操心如何將程式的資料儲存到檔案中。

你的程式稍後可以使用shelve 模組,重新開啟這些檔案並取出資料。shelf 值不必用讀模式或寫模式開啟,因為它們在開啟後,既能讀又能寫。

shelfFile = shelve.open('mydata')

>>> type(shelfFile)

<class 'shelve.DbfilenameShelf'>

>>> shelfFile['cats']

['Zophie', 'Pooka', 'Simon']

>>> shelfFile.close()

像字典一樣,shelf 值有keys()values()方法,返回shelf 中鍵和值的類似列表的值。因為這些方法返回類似列表的值,而不是真正的列表,所以應該將它們傳遞給list()函式,取得列表的形式。

>>> shelfFile = shelve.open('mydata')

>>> list(shelfFile.keys())

['cats']

>>> list(shelfFile.values())

[['Zophie', 'Pooka', 'Simon']]

>>> shelfFile.close()

還有一種方式可以用來儲存變數

pprint.pformat()函式將返回文字字串,但不是列印它。這個字串不僅是易於閱讀的格式,同時也是語法上正確的Python 程式碼。假定你有一個字典,儲存在一個變數中,你希望儲存這個變數和它的內容,以便將來使用。

pprint.pformat()函式將提供一個字串,你可以將它寫入.py 檔案。該檔案將成為你自己的模組,如果你需要使用儲存在其中的變數,就可以匯入它。

例如,在互動式環境中輸入以下程式碼:

>>> import pprint

>>> cats = [{'name': 'Zophie', 'desc': 'chubby'}, {'name': 'Pooka', 'desc': 'fluffy'}]

>>> pprint.pformat(cats)

"[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]"

>>> fileObj = open('myCats.py', 'w')

>>> fileObj.write('cats = ' + pprint.pformat(cats) + '\n')

83

>>> fileObj.close()

這裡,我們匯入了pprint,以便能使用pprint.pformat()。我們有一個字典的列表,儲存在變數cats 中。為了讓cats 中的列表在關閉互動式環境後仍然可用,我們利用pprint.pformat(),將它返回為一個字串。當我們有了cats 中資料的字串形式,就很容易將該字串寫入一個檔案,我們將它命名為myCats.py

import 語句匯入的模組本身就是Python 指令碼。如果來自pprint.pformat()的字元串儲存為一個.py 檔案,該檔案就是一個可以匯入的模組,像其他模組一樣。由於Python 指令碼本身也是帶有.py 副檔名的文字檔案,所以你的Python 序甚至可以生成其他Python 程式。然後可以將這些檔案匯入到指令碼中。