本人最近新學python ,用到文本文件的讀取,經過一番研究,從網上查找資料,經過測試,總結了一下讀取文本文件的方法.
1、在讀取文本文件的時無非有兩種方法:
a、f=open('filename', 'r')
content=f.read().decode('utf-8')
b、f=codecs.open(XXX, encoding='utf-8')
content=f.read()
2、讀取Utf8格式的文本文件
# -*- coding: UTF8 -*-
import os
import sys
import os.path
import codecs
'''讀取文本Utf8格式的文本文件,不需要設置特殊的編碼方式,安裝默認就行'''
def ReadUtf8TxtFile1(strFileName):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
if os.path.isfile(fileName):
filehandler = open(fileName,'r')
outStr = filehandler.read()
filehandler.close()
return outStr
3、讀取Ansi格式的文本文件
'''讀取Ansi格式的文本文件,不需要設置特殊的編碼方式,安裝默認就行'''
def ReadAnsiTxtFile(strFileName):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
if os.path.isfile(fileName):
filehandler = codecs.open(fileName,'r','gbk')
outStr = filehandler.read()
filehandler.close()
return outStr
4、讀取文本unicode格式的文本文件
'''讀取文本unicode格式的文本文件,不需要設置特殊的編碼方式,安裝默認就行'''
def ReadUnicodeTxtFile(strFileName):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
if os.path.isfile(fileName):
filehandler = codecs.open(fileName,'r','utf-16')
outStr = filehandler.read()
filehandler.close()
return outStr
5、讀取utf-8編碼文件(有BOM)格式的文本文件
'''讀取utf-8編碼文件(有BOM)格式的文本文件,不需要設置特殊的編碼方式,安裝默認就行'''
def ReadUtf8BOMTxtFile(strFileName):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
if os.path.isfile(fileName):
filehandler = codecs.open(fileName,'r')
outStr = filehandler.read()
filehandler.close()
if outStr[:3] == codecs.BOM_UTF8
outStr = outStr[3:].decode("utf8")
return outStr
6、綜合以上幾種方法可以可以看到,首先要獲取文件的編碼方式,然后再打開文件,這樣可以整合為一個方法:
# -*- coding: UTF8 -*-
import os
import sys
import os.path
import codecs
import chardet
'''讀取文本文件,注意文件的編碼方式ANSI,Unicode,Unicode big endian,UTF-8,
首先要讀取文件的編碼方式,然后在用指定的編碼方式來讀取文件
'''
def ReadTxtFile(strFileName):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
filehandler = open(fileName,'r')
outStr = filehandler.read()
filehandler.close()
#讀取編碼方式
charset = chardet.detect(outStr)
filehandler = codecs.open(fileName,'r',charset['encoding'])
outStr = filehandler.read()
filehandler.close()
return outStr
'''讀取文本文件,注意文件的編碼方式ANSI,Unicode,Unicode big endian,UTF-8,
首先要讀取文件的編碼方式,然后在用指定的編碼方式來讀取文件
'''
def ReadTxtFile(strFileName):
fileName = unicode(strFileName, "utf8")
with open(fileName, 'r') as filehandler:
outStr = filehandler.read()
#讀取編碼方式
charset = chardet.detect(outStr)
with codecs.open(fileName,'r',charset['encoding']) as filehandler:
outStr = filehandler.read()
return outStr
Python引入了with
語句來自動幫我們調用close()
方法,和try ... finally
是一樣的,但是代碼更佳簡潔,並且不必調用close()
方法。
7、寫文本文件
'''寫文本文件,如果文件不存在,則建立文件,如果存在,則以追加方式寫入strConent'''
def WriteFile(strFileName,strContent):
'''之所以加這樣一句,是因為如果文件名包含中文路徑,導致亂碼'''
fileName = unicode(strFileName, "utf8")
writeStyle = 'w'
if os.path.isfile(strFileName):
writeStyle = 'a'
filehandler = open(fileName,'a')
filehandler.write(strContent)
filehandler.close()
打開文件調用read()
會一次性讀取文件的全部內容,如果文件有10G,內存就爆了,所以,要保險起見,可以反復調用read(size)
方法,每次最多讀取size個字節的內容。另外,調用readline()
可以每次讀取一行內容,調用readlines()
一次讀取所有內容並按行返回list
。因此,要根據需要決定怎么調用。
如果文件很小,read()
一次性讀取最方便;如果不能確定文件大小,反復調用read(size)
比較保險;如果是配置文件,調用readlines()
最方便: