首页 > 编程语言 > 详细

Python 读写文件

时间:2020-04-02 17:28:39      阅读:71      评论:0      收藏:0      [点我收藏+]

(一)操作文件

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=‘‘,否则没写入一行记录的后面会多一个空行

 

Python 读写文件

原文:https://www.cnblogs.com/jg01/p/12620337.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!