python 讀寫文本文件


本人最近新學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()最方便:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM