zoukankan      html  css  js  c++  java
  • 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()最方便:

  • 相关阅读:
    CentOS 安装Python3, pip3
    Pyinstaller打包python程序,以及遇到的问题:Cannot find existing PyQt5 plugin directories
    [Python] fetchone()和fetchall()
    在Linux命令行下,如何登录mysql server
    管理MySQL的客户端软件-MySQL Workbench
    在win10修改jupyter notebook(Anaconda安装)工作路径
    安装spark过程中出现Exception in thread "main" java.lang.UnsupportedClassVersionError错误的解决办法
    如何在win10本地主机操作系统和virtualBox 的Ubuntu之间设置共享文件夹
    支持向量机(SVM)
    特征工程(python)
  • 原文地址:https://www.cnblogs.com/shaosks/p/5594722.html
Copyright © 2011-2022 走看看