最近在公司寫RF自動化測試用例,Web測試,當時寫這個的時候,有位大佬給了幾個他自己寫的例子和基於selenium庫寫的一些方法,基於Python標準庫的一些方法,今天寫的時候,翻看大佬寫的自建庫的一些方法,使用他寫的方法中關於讀寫文件這塊總是報錯,於是上網查了查,以下分享我查到的關於Python標準庫對於文件的基本操作和文件路徑中存在中文編碼的處理。
先了解一下文件操作基礎知識
-
open 函數
你必須先用Python內置的open()函數打開一個文件,創建一個file對象,相關的方法纔可以調用它進行讀寫。
file = open(file_name [, access_mode][, buffering])
各個參數的細節如下:
file_name:file_name變量是一個包含了你要訪問的文件名稱的字符串值。
access_mode:access_mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式爲只讀(r)。
r |
以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb |
以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。 |
r+ |
打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ |
以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。 |
w |
打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb |
以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
w+ |
打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb+ |
以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
a |
打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
ab |
以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
a+ |
打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ |
以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
-
close()方法
File 對象的 close()方法刷新緩衝區裏任何還沒寫入的信息,並關閉該文件,這之後便不能再進行寫入。
當一個文件對象的引用被重新指定給另一個文件時,Python 會關閉之前的文件。用 close()方法關閉文件是一個很好的習慣。
fileObject.close()
例子:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打開一個文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
# 關閉打開的文件
fo.close()
-
write()方法
write()方法可將任何字符串寫入一個打開的文件。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。
write()方法不會在字符串的結尾添加換行符('\n'):
fileObject.write(string)
-
read()方法
read()方法從一個打開的文件中讀取一個字符串。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。
語法:
fileObject.read([count])
在這裏,被傳遞的參數是要從已打開文件中讀取的字節計數。該方法從文件的開頭開始讀入,如果沒有傳入count,它會嘗試儘可能多地讀取更多的內容,很可能是直到文件的末尾。
File對象的屬性
一個文件被打開後,你有一個file對象,你可以得到有關該文件的各種信息。
以下是和file對象相關的所有屬性的列表:
屬性 |
描述 |
file.closed |
返回true如果文件已被關閉,否則返回false。 |
file.mode |
返回被打開文件的訪問模式。 |
file.name |
返回文件的名稱。 |
file.softspace |
如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。 |
如下實例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打開一個文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已關閉 : ", fo.closed
print "訪問模式 : ", fo.mode
print "末尾是否強制加空格 : ", fo.softspace
Python File(文件) 方法
file 對象使用 open 函數來創建,下表列出了 file 對象常用的函數:
序號 |
方法及描述 |
1 |
關閉文件。關閉後文件不能再進行讀寫操作。 |
2 |
刷新文件內部緩衝,直接把內部緩衝區的數據立刻寫入文件, 而不是被動的等待輸出緩衝區寫入。 |
3 |
返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。 |
4 |
如果文件連接到一個終端設備返回 True,否則返回 False。 |
5 |
返回文件下一行。 |
6 |
從文件讀取指定的字節數,如果未給定或爲負則讀取所有。 |
7 |
讀取整行,包括 "\n" 字符。 |
8 |
讀取所有行並返回列表,若給定sizeint>0,則是設置一次讀多少字節,這是爲了減輕讀取壓力。 |
9 |
設置文件當前位置 |
10 |
返回文件當前位置。 |
11 |
截取文件,截取的字節通過size指定,默認爲當前文件位置。 |
12 |
將字符串寫入文件,返回的是寫入的字符長度。 |
13 |
向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。 |
Python文件路徑基礎
file object = open(file_name [, access_mode][, buffering]
我們直接從電腦複製的路徑是這種"C:\Windows\System32\drivers\etc\test.txt"
路徑寫法(filename寫法):
採用下面任何一種書寫形式均可:
- 使用斜槓“
/
”:
"C:/Windows/System32/drivers/etc/test.txt"
不用反斜槓就沒法產生歧義了(推薦使用此寫法“/",可以避免很多異常)
- 將反斜槓符號轉義
"C:\\Windows\\System32/\\drivers\\etc\\test.txt"
因爲反斜槓是轉義符,所以兩個”\\
“就表示一個反斜槓符號
- 使用Python的raw string
r"C:\Windows\System32\drivers\etc\test.txt"
python下在字符串前面加上字母r
,表示後面是一個原始字符串raw string,不過raw string主要是爲正則表達式而不是windows 路徑設計的,所以這種做法儘量少用,可能會出問題。(前面加r
說的是讀取到原始字符串)。
文件路徑含中文處理方式
(1)
open(filename, 'w')這個方法中,filename這個參數必須是Unicode編碼的參數。
我之前加上#-*-coding:utf-8-*-將編碼設置爲utf-8,當調用這個方法往裏傳參數時,需要將這個變量filename解碼成 Unicode。
比如filename='中文.txt',使用open()時,這樣寫open(filename.decode('utf-8'), 'w'),這樣創建的中文文件名就沒有亂碼問題
(2)
python直接讀取中文路徑的文件時失敗,可做如下處理:
inpath ='
C:/Windows/System32/drivers/寶寶/test.txt'
uipath = unicode(ipath , "utf8")
然後用"uipath"經過編碼後的路徑去open()即可:
fin = open(uipath)
(3)
打開路徑含有中文的文件時,要注意:
在windows對文件名編碼是採用gbk等進行編碼保存,所以要將文件路徑先解碼,在按gbk編碼:
字符串--解碼成unicode--編碼(注意str和unicode的轉換)
with open(r"D:\我的文檔\桌面\python\test.py".decode('utf8').encode('gbk'),'rb') as f:
print f.read()
或者採用
#coding=utf-8 #當然這裏要在前面設置系統的編碼方式
with open(ur"D:\我的文檔\桌面\python\test.py".encode('gbk'),'rb') as f:
或者with open(ur"D:\我的文檔\桌面\python\test.py",'rb') as f:
摘要: 在windows使用gbx(gb2312,gbk,gb18030我也不知道是哪個)對文件名及文件路徑進行編碼保存。打開文件的函數中使用諸如open(filename.encode('gbk'))可以很好的解決。另外路徑分隔符要寫Unix風格的'/',不要寫'\'
windows使用gbx(gb2312,gbk,gb18030我也不知道是哪個)對文件名及文件路徑進行編碼保存。打開文件的函數中使用諸如open(filename.encode('gbk'))可以很好的解決。
(4)
a="C:\Users\Dell\Desktop\ATOU\測試用例" (帶中文的路徑)
a=a.decode("utf-8").encode("gbk") (進行轉碼)
import sys
sys.path.append(a) (指定路徑成功)
合併起來一條:
import sys
sys.path.append("C:\Users\Dell\Desktop\ATOU\公共測試用例".decode("utf-8").encode("gbk"))
文件的路徑出現瞭解析錯誤的情況,所以在傳入文件路徑的時候先把文件的編碼格式轉了先給代碼前邊加
#encoding=utf-8
#encoding=utf-8
inpath = 'D:/學習/python/python學習/cc.txt'
uipath = unicode(inpath , "utf8")
fr=open(uipath,"r")
f=fr.read()
print f
fr.close()
(5)
找了這麼多,基本都是找的別人的例子,以上關於中文處理不保證有效性,遇到這個多試試吧,我分享一下我最後的做法。
f = open(r"C:\Windows\System32\drivers\etc\”+u”
中文測試"
,"r")
- 關於中文路徑這兒說幾點:
1 、據說python3就沒有中文路徑文件操作報錯這個問題了,奈何我用的是2.7。
2、 u’字符串’ 代表是unicode格式的數據,路徑最好寫成這個格式,別直接跟字符串’字符串’這類數據相加,相加之後type 就是str,這樣就會存在解碼失誤的問題。
3、在查找資料過程中,有一種說法就是路徑不能超過五層,也就是路徑中“\”最多四個,我當時的“\”就是四個,沒試過五 個會怎麼樣。
這麼多東西算是大雜燴,找了很多資料總結的,我可以說沒學過Python,暫時也沒打算學,所以查東西的時候,沒往深的探究,貼出來的知識也都很基礎,希望能和大家一起討論分享,共同進步。