python 读写文件
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()
最方便:
下载视频文件
# tqdm模块是python进度条库 from tqdm import tqdm def downVideo(fileName,url): try: response = requests.get(url, stream=True) file_size= int(response.headers[\'content-length\']) # fileName = r\'D:\test.mp4\' if os.path.exists(fileName): first_byte=os.path.getsize(fileName) else: first_byte=0 if first_byte>=file_size: return file_size header={\'Range\':f\'bytes={first_byte}-{file_size}\'} pbar = tqdm(total=file_size,initial=first_byte,unit=\'B\',unit_scale=True,desc=fileName) response = requests.get(url, headers=header,stream=True) with(open(fileName, \'ab\')) as f: for chunk in response.iter_content(chunk_size=512): if chunk: f.write(chunk) pbar.update(512) # f = open(fileName, \'wb\') pbar.close() except Exception as ex: print(ex)