文章目錄
- 讀文件
- python2&python3差異
- 示例代碼
- 文件路徑
- 問題處理:字符編碼報錯
讀文件
python2&python3差異
普通模式(python2、python3通用)
f = open(fileName, mode='r')
open函數在python2和python3差異點:
python3支持多個參數,python2只有2個參數,且對于文件編碼不支持
#python3
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open#python2
open(name[, mode[, buffering]])
python2如何支持不同編碼的文件讀寫?
import codecs
# 這里增加u是為了防止亂碼,詳見 https://blog.csdn.net/songlh1234/article/details/83791205
fileNameWrite = u'測試codecs寫入gbk.txt'
fileWrite = codecs.open(fileNameWrite, 'w', "gbk")
fileWrite.write('設備編號,deviceID,ehomeKey,執行結果,返回報文\n')
另外這里需要注意,以上代碼在python3下執行正常,但write這一行代碼在python2下會報錯:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)
需要額外設置默認字符
try:# Python2reload(sys)sys.setdefaultencoding("utf-8")
except NameError:print('NameError')
示例代碼
UTF-8編碼方式打開文件
def openFile(path):f = Nonetry:f = open(path, encoding='UTF-8')except FileNotFoundError:print("open file %s error" % path)else:print("open file %s ok" % path)return f
gb18030編碼方式打開文件
def openFile(path):f = Nonetry:f = open(path, encoding='gb18030')except FileNotFoundError:print("open file %s error" % path)else:print("open file %s ok" % path)return f
說明:如果不帶encoding參數,會采用系統編碼,Windows下默認為gbk
讀取文件內容
file_name = r"D:\1.txt"
f = openFile(file_name)
for line in f:print(line)
文件路徑
獲取當前路徑:
os.getcwd()
拼接路徑和文件名
fileName1 = os.path.join(filePath, fileName)
獲取文件所在的文件目錄
directory_path = os.path.dirname(file_name) # 根據絕對路徑,返回所在的目錄
問題處理:字符編碼報錯
讀取文件字符時遇到如下問題:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa6 in position 1909: illegal multibyte sequence
問題原因:文檔默認使用’gbk’編碼打開,但文檔實際編碼是gb18030,有些字符無法被gbk識別。
解決方案:打開文件的時候可以指定字符集為gb18030
f = open(path, encoding="gb18030")