任何语言都离不开对文件的操作,那么Python语言是如何操作和管理文件的。编码方式的历史大致是ASCII->gb2312->unicode->utf-8。期间的具体细节,大家可以在百度上举个编解码的小例子。首先,记住中文可以用GBK和utf-8编码。GBk中一个汉字对应两个字节,utf-8中一个汉字对应三个字节。中文不能用ASCII编码。>>>'刘润森'.encode('GBK')b'\xc1\xf5\xc8\xf3\xc9\xad'>>>'刘润森'.encode('ascii')Traceback(mostrecentcallast):File"",line1,inUnicodeEncodeError:'ascii'codeccan'tencodecharactersinposition0-2:ordinalnotinrange(128)>>>'Runsen'.encode('ascii')b'Runsen'>>>"刘润森".encode('utf-8')b'\xe5\x88\x98\xe6\xb6\xa6\xe6\xa3\xae'>>>'刘润森'.encode('GBK').decode('GBK')'刘润森'>>>'刘润森'.encode('GBK').decode('utf-8')UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xc1inposition0:invalidstartbyte如果编码解码格式不一致,有可能是乱码。encode是编码的意思,decode是解码的意思。文件操作API下面是Python文件操作的具体API。打开文件当Python的open()函数打开文件时,有几个参数可用。但是,最常用的参数只有前两个。open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)注意第一个是必须的,其余的都是可选的。如果不添加mode参数,文件将在Python中以只读模式打开。encoding:可以留空。如果不指定参数,则默认密码本为操作系统的默认密码本。Windows默认为gbk,Linux默认为utf-8,mac默认为utf-8。f=open('test.txt',encoding='utf-8')#openfiledata=f.read()#readfileprint(data)f.close()#closefilemodereadfilecode的内容用于文件操作的1.txt文件如下:按照《Python之王》公众号作者:Runsenreadline(),使用该方法时需要指定打开文件的方式为r或r+;readlines(),读取所有行。返回一个列表,列表中的每个元素都是原始文件的每一行。如果文件很大,占用内存,很容易崩溃。#打开文件读取f=open("1.txt","r",encoding='utf-8')#根据大小读取文件内容print('输出来自read()方法\n',f.read(2048))#关闭文件f.close()#打开文件读写f=open("1.txt","r+",encoding='utf-8')#读取第二个单词和前2行文件内容print('输出来自readline()方法\n',f.readline(2))print('输出来自readlines()方法\n',f.readlines(2))#关闭文件f.close()#打开文件进行读取和追加f=open("1.txt","r",encoding='utf-8')#打开文件fileforreadingandappendingprint('outputfromreadlines()Method\n',f.readlines())#关闭文件f.close()#输出如下输出来自read()方法attention《Python之王》公众号作者:Runsen输出来自readline()方法注意力输出来自readlines()方法['《Python之王》公众号\n']输出来自readlines()方法['关注《Python之王》公众号\n','作者:润生']写信给file下面只介绍清除w追加a的情况:将重点放在《Python之王》公众号写入进入test.txt文件#mode=w没有文件就创建,有就清除内容,用withopen('test.txt','w',encoding='utf-8')仔细asfb:fb.write('follow《Python之王》公众号\n')接下来写作者:Runsen到test.txt文件中withopen('test.txt','w',encoding='utf-8')asfb:fb.write('Author:Runsen\n')运行后会发现之前写的注意《Python之王》公众号内容已经改为Author:润森,因为w模式会清空原文件内容,所以慎重使用。只要用到w,就必须一口气写完。加个case:在test.txt文件中加入静夜思这首诗#mode=aappendtotheendofthefilewithopen('test.txt','a',encoding='utf-8')asfb:fb.write('关注《Python之王》公众号\n')withopen('test.txt','a'encoding='utf-8')asfb:fb.write('作者:润生\n')指针操作的东西或者资源他们都是以文件的形式存在的,比如消息、共享内存、连接等,句柄可以理解为指向这些文件的指针。句柄(handle)是从编译原理上来的术语,指的是句子中最先被规范的部分,所以有“句”字。handle的作用是定位,两个API还是tell和seek。tell返回文件对象在文件中的当前位置,seek将文件对象移动到指定位置,传入的参数是offset,表示移动的偏移量。下面通过一个例子来进一步理解上面的函数,如下:withopen('test.txt','rb+')asf:f.write(b'润森')#文件对象位置print(f.tell())#移动到文件的第四个字节f.seek(3)#读取一个字节,文件对象向后移动一位print(f.read(1))print(f.tell())#whence是可选参数,值为0表示从文件开头开始计数(默认值),值为1表示使用当前文件位置,值为2表示使用文件末尾作为参考点#移动到倒数第二个字节f.seek(-2,2)print(f.tell())print(f.read(1))#输出如下6b的'450上下文管理我们会执行这样的操作:打开文件,读写,和关闭文件。程序员经常忘记关闭文件。上下文管理器可以在不需要文件时自动关闭文件,只需使用withopen即可。#withcontextmanagerwithopen("new.txt","w")asf:print(f.closed)f.write("HelloWorld!")print(f.closed)#输出如下FalseTrue如何批量读取多个文件下面,批量读取一个文件夹下的一个txt文件file_list=['1.txt','2.txt','3.txt','4.txt']forpathinfile_list:withopen(path,encoding='utf-8')asf:forlineinf:print(line)会批量读取文件夹下的txt文件内容,并合并到一个新文件5.txt中。具体实现代码如下。importos#获取目标文件夹的路径filedir=os.getcwd()+'\\'+'\\txt'#获取当前文件夹的文件名列表filenames=[]foriiinos.listdir(filedir):ifi.split(".")[-1]=='txt':filenames.append(i)#打开当前目录下的5.txt文件,如果没有则创建f=open('5.txt','w')#首先遍历文件名forfilenameinfilenames:filepath=filedir+'\\'+filename#遍历单个文件,读取行数forlineinopen(filepath,encoding='utf-8'):f.writelines(line)f.write('\n')#关闭文件f.close()其实在Windows中只需要cd到目标文件夹即可,即需要将所有要合并的txt文件添加到target文件夹,执行以下DOS命令type*.txt>C:\Targetpath\Mergedfilename.txt练习题目:创建文件data.txt,文件一共10万行,每行存储一个1到1之间的整数和100.题目来源:牛客importrandomf=open('data.txt','w+')foriinrange(100000):f.write(str(random.randint(1,100))+'\n')f.seek(0)print(f.read())f.close()题目:生成100个MAC地址并写入文件。MAC地址(十六进制)的前6位是01-AF-3B。题源:牛客importrandomimportstringdefcreate_mac():MAC='01-AF-3B'hex_num=string.hexdigits#0123456789abcdefABCDEFforiinrange(3):n=random.sample(hex_num,2)sn='-'+''.join(n).upper()MAC+=snreturnMACdefmain():withopen('mac.txt','w')asf:foriinrange(100):mac=create_mac()print(mac)f.write(mac+'\n')main()本文已收录到GitHub,传送门~[1],大厂面试有完整考点,欢迎星星