Python 读写文件

(一)操作文件

python中的open()函数用于打开一个文件,创建一个file对象。使用file对象对文件进行读写操作。

file = open(name, mode, encoding=None)
  • name: 需要访问文件的文件名,包括文件路径和文件名
  • mode: 打开文件的模式: 只读 (r), 写入 (w), 追加 (a)。 这个参数是非轻质的,默认文件访问模式为只读 (r)
  • encoding:打开文件的编码方式,是可选参数。如果写入的是中文,那么encoding编码方式是'utf-8'

                                                                 【表-文件的打开模式】

模式 描述
r 以只读方式打开文件。文件的指针会放在文件的开始。这是默认模式
rb 以二进制格式打开一个文件用于只读
r+ 打开一个文件用于读写。文件指针将会放在文件的开始
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开始
w

打开一个文件只用于写入。如果该文件已存在则打开文件,并从开始部分编辑,

即原有内容会被删除。如果该文件不存在,则创建新文件。

wb

以二进制格式打开一个文件只用于写入。如果已存在则打开文件,并从开始

部分编辑,原有内容会被删除。如果不存在,则创建新文件。

w+

打开一个文件用于读写。如果该文件已存在则打开文件,并从开始部分

编辑,即原有内容会被删除。如果该文件不存在,则创建新文件。

wb+

以二进制格式打开一个文件用于读写。如果文件已存在则打开文件,并从

开始部分编辑,即原有内容会被删除。如果不存在,则创建新文件。

a

打开一个文件用于追加。如果该文件已经存在,文件指针会放在文件的结尾。

如果该文件不存在,则创建新文件进行写入

a+

打开一个文件用于读写。如果该文件已经存在,文件指针会放在文件的结尾。

文件打开时是追加模式。若不存在,则创建新文件用于读写

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针会放在

文件的结尾。如果不存在,则创建新文件用于读写

file对象最主要方法说明如下:

  • file.read([size]): 读取文件的全部内容,如果指定size参数,每次最多读取size字节的内容
  • file.readline(): 读取文件一行的内容
  • file.readlines([size]): 读取文件的全部行,以列表形式返回。如果指定size参数,读取包含size行的列表
  • file.write(str): 在文件中写入字符串。如果写入字符串以外的数据,需要把数据转换成字符串
  • file.close(): 关闭文件,释放资源
1 file = open('d:/test.txt','r',encoding='utf-8')  #打开文件
2 data = file.read()    # 通过句柄对文件进行操作
3 print(data)
4 file.close()   #关闭文件
View Code

以上例子使用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()
View Code
file = open('d:/test.txt','r',encoding='utf-8')
for line in file: 
    print(line)
file.close()
View Code

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()
View Code

以上代码可能会造成 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()
View Code

(二)使用 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='',否则没写入一行记录的后面会多一个空行

 

posted on 2020-04-02 16:22  猪伯  阅读(320)  评论(0编辑  收藏  举报

导航