(一)操作文件
python中的open()函数用于打开一个文件,创建一个file对象。使用file对象对文件进行读写操作。
file = open(name, mode, encoding=None)
【表-文件的打开模式】
模式 | 描述 |
r | 以只读方式打开文件。文件的指针会放在文件的开始。这是默认模式 |
rb | 以二进制格式打开一个文件用于只读 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开始 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开始 |
w |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开始部分编辑, 即原有内容会被删除。如果该文件不存在,则创建新文件。 |
wb |
以二进制格式打开一个文件只用于写入。如果已存在则打开文件,并从开始 部分编辑,原有内容会被删除。如果不存在,则创建新文件。 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开始部分 编辑,即原有内容会被删除。如果该文件不存在,则创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果文件已存在则打开文件,并从 开始部分编辑,即原有内容会被删除。如果不存在,则创建新文件。 |
a |
打开一个文件用于追加。如果该文件已经存在,文件指针会放在文件的结尾。 如果该文件不存在,则创建新文件进行写入 |
a+ |
打开一个文件用于读写。如果该文件已经存在,文件指针会放在文件的结尾。 文件打开时是追加模式。若不存在,则创建新文件用于读写 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针会放在 文件的结尾。如果不存在,则创建新文件用于读写 |
file对象最主要方法说明如下:
1 file = open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) #打开文件 2 data = file.read() # 通过句柄对文件进行操作 3 print(data) 4 file.close() #关闭文件
以上例子使用file.read()方法一次性读取 d:/test.txt 文件的全部内容到内存。如果读取的文件有30GB,那么读取文件时会出现MemoryError异常,也就是内存溢出异常。所以当读取当文件比较小时,使用file.read() 方法一次性读取文件内容到内存很方便,但当读取大文件时,需要反复调用 file.read(size) 方法,且每次最多读取 size 个字节文件内容,以避免一次性读取大文件到内存而导致内存溢出异常。
file = open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) for line in file.readlines(): print(line.strip()) file.close()
file = open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) for line in file: print(line) file.close()
python中str.strip([chars]) 移除字符串头尾指定的字符序列。
如何避免大文件一次性读造成的MemoryError?例子:复制二进制文件(二进制文件指的是图片,音频和视频文件),用 file.read(size) 优化读写
1 file = open(‘photo.jpg‘,‘rb‘) 2 content = file.read() 3 file.close() 4 5 file2 = open(‘photo2.jpg‘,‘wb‘) 6 file2.write(content) 7 file2.close()
以上代码可能会造成 MemoryError, 一下代码是OK的
1 import os 2 # 获得复制文本的大小 3 fileTotalSize = os.stat(‘photo.jpg‘).st_size 4 # print("fileTotalSize={0}".format(fileTotalSize)) 5 # 已读文件大小 6 readSize = 0 7 8 file1 = open(‘photo.jpg‘,‘rb‘) 9 file2 = open(‘photo2.jpg‘,‘wb‘) 10 11 while readSize < fileTotalSize: 12 # 每次读取 50KB 的文件内容 13 content = file1.read(1024*50) 14 readSize = readSize + len(content) 15 file2.write(content) 16 else: 17 printf("fileTotalSize={0},readSize={1}".format(fileTotalSize,readSize)) 18 19 file1.close() 20 file2.close()
(二)使用 with 语句自动执行 file.close() 来释放文件资源
1 file = open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) 2 data = file.read() 3 file.close()
在执行 file.read() 从文件中读取数据时,有可能产生IOError 异常。一旦出错,后面的 file.close() 就不会执行,所有无论是否出错都能正常关闭文件,可以使用 try...finally 来示实现异常处理
try: file = open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) data = file.read() finally: if file: file.close()
虽然,以上代码运行良好,但是过于冗长。Python 引入 with 语句自动执行 file.close() 来释放文件资源
1 with open(‘d:/test.txt‘,‘r‘,encoding=‘utf-8‘) as file: 2 print(file.read()) 3 # 统计文件有多少行 4 print(‘rows:%d‘ %len(file.readlines())) 5
(三)电子表格 (csv)
csv文件是用文本文件形式存储的表格数据,可以使用Excel打开查看。csv文件中每行相当于一条记录,以换行符(\n)结束。每条记录由多个字段组成,每个字段的分隔符是‘,‘
例子 text.csv
name | age | address |
wang | 20 | beijing |
li | 21 | tianjin |
从 csv 文件读取数据
1 import csv 2 with open(‘test.csv‘,‘r‘) as file: 3 reader = csv.reader(file) 4 for row in reader: 5 print(row)
以上代码 通过迭代器访问 reader 对象,reader对象把读取的csv文件的每行数据都转换成一个Python列表(list),列表中的每个元素都是一个字符串
运行结果是
[‘name‘,‘age‘,‘address‘]
[‘wang‘,‘20‘,‘beijing‘]
[‘li‘,‘21‘,‘tianjin‘]
1 import csv 2 with open(‘text.csv‘) as file: 3 for line in file: 4 # 返回一行数据 5 print(line.strip())
运行结果
name,age,address
wang,20,beijing
li,21,tianjin
写数据到csv文件
1 import csv 2 with open(‘d:/test.csv‘,‘‘r‘,newline=‘‘) as file: 3 writer = csv.write(file) 4 writer.writerow([‘a‘,‘b‘,‘c‘]) 5 writer.writerow([1,2,3]) 6 writer.writerow([4,5,6])
使用 writer.writerow() 把列表数据写入 csv 文件中,一次写入一次记录。
写数据到 csv 文件中,使用 open() 函数时,要指明 newline=‘‘,否则没写入一行记录的后面会多一个空行
原文:https://www.cnblogs.com/jg01/p/12620337.html