Python中的文件(File)操作 读写文件 读写CSV文件

鳄鱼君

发表文章数:643

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Python中的文件(File)操作 读写文件 读写CSV文件

在后面的爬虫中,我们常常会选择爬取一些图片、视频,那么就需要把这些二进制文件保存到本地,方便以后自己查看使用,今天就来学习一下怎么操作文件吧!先从最简单打开文件学习吧

Python读/写文件

使用Python读/写文件需要使用open关键字,它的作用就是打开一个文件,并创建一个文件对象。它的完整语法格式为:

open(file,
    mode='r', 
    buffering=-1, 
    encoding=None, 
    errors=None, 
    newline=None, 
    closefd=True, 
    opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener:

mode 参数:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(Python 3 不支持)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

前面的内容需要了解,在后面使用时可以进行查看,这里再来说打开文件的两种方式。

#第一种方式
f=open("文件路径","文件操作方式",encoding="utf-8")
    #通过文件的相关函数来进行操作
    f.close()

#第二种方式
with open("文件路径","文件操作方式",encoding="utf-8") as f:
    #采用相关的文件函数来操作
    f.close()

#with支持打开多个文件
with open('file.py','r',encoding='utf-8') as f1,\
        open('file1.py','r',encoding='utf-8') as f2:
    print(f1.readline())
    print(f2.readline())

第一种方式需要手动关闭文件,但是在程序开发中,你可能会经常忘掉关闭文件的情况。第二种方式不需要手动关闭文件,只要代码退出了缩进,Python就会自动关闭文件,为了规范起见,我还是写上了close()来关闭文件,说这么多,就是让你去使用第二种方式来操作。我们需要先了解一下相关文件操作的函数

与File有关的函数

序号 方法及描述
file.close()

关闭文件。关闭后文件不能再进行读写操作。

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

file.next()

Python 3 中的 File 对象不支持 next() 方法。

返回文件下一行。

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

file.readline([size])

读取整行,包括 “\n” 字符。

file.readlines([sizeint])

读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

file.seek(offset[, whence])

移动文件读取指针到指定位置

file.tell()

返回文件当前位置。

file.truncate([size])

从文件的首行首字符开始截断,截断文件为 size
个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

file.write(str)

将字符串写入文件,返回的是写入的字符长度。

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

Python读取文件操作

#r是文件的读取模式,默认是只读r,规范必须写上打开模式
file=open('file.py','r',encoding='utf-8').read()#需要加上编码,.py后缀要加上,简单读取文件,一般不这样用
f=open('file1.py','r',encoding='utf-8') #简单的复制操作,文件句柄
#你可以使用w写入的模式打开文件,但是会被清空等于是创建一个新文件,因为文件是存在的,不能进行读写操作
file_1=f.read()
file_2=f.read()
print('-------------',file_2) #file_1读取完之后,指针是在末尾的,file_2在读取肯定不会显示内容
print(f.readline()) #一行一行的读取
for i in range(10): #你可以采用循环的方式读取多行操作
    print(f.readline())
for i in f.readlines(): #readlines()读取多行,返回一个list列表,一行一个元素
    print(i.strip()) #你可以把前后的换行去掉
for i in f: #官方建议用法,效率比较高
    print(i.strip())

f.close()

Python写文件操作

file=open('file.py','r',encoding='utf-8').read()#需要加上编码,.py后缀要加上,简单读取文件,一般不这样用
f=open('file1.py','w',encoding='utf-8') #简单的复制操作,文件句柄

f.write('我叫zjj,今年18sui\n')
f.write('没有工作,没有女朋友')
f.write('哈哈哈哈哈哈哈哈............')
print(f)

f.close()

其它常用操作

file=open('file.py','r',encoding='utf-8').read()#需要加上编码,.py后缀要加上,简单读取文件,一般不这样用
f=open('file.py','r',encoding='utf-8') #简单的复制操作,文件句柄
f.tell() #查询当前光标的位置,也就是指针,以字符计数
print(f.readline())
f.seek(0) #指针回到0位置
print(f.encoding) #打印当前文件的字符编码,因为前面已经utf-8编码过了
f.truncate()#从开始截取字符,不受指针位置的影响
f.close()
f=open('file.py','w',encoding='utf-8') #简单的复制操作,文件句柄
f.write('wojiajodkwdoiwi\n')

f.flush() #可以理解为刷新内存的缓存,有时候你写入的时候可能没有内容,这个方法可以让写入之后就显示出来
#在pycharm可能看不到效果,write写入很快
#如果想看到效果的话,可以去cmd命令行测试
f.write('你我打款收到那可恶的')
f.close()

文件的读写操作

f=open('file.py','r+',encoding='utf-8')
print(f.readline()) #我们可以读
f.write('\n现在还没有收到款') #也可以写
#写的方法是在文件末尾写入
#常用的也就是读写模式
#你也可以自己试试上面的方法,a+追加读写
f.close()

c=open('file.py','w+',encoding='utf-8') #写读操作
#先创建文件,存在的话会清空源文件
c.write('---------我实在是没有办法l\n')
c.write('----------我实在是没有办法l\n')
c.write('--------我实在是没有办法l\n')
c.write('--------我实在是没有办法l\n')
print(c.tell()) #告诉我们当前光标的位置
c.seek(1)  #光标回到1的位置,就是在--之间
print(c.tell())
print(c.readline()) #读取第一行
c.write('该文字只能写到文章末尾') #只能加到文件的末尾

c.close()

打开二进制文件

f=open('file.py','rb') #二进制文件,不需要编码,文件也可以读取,只不过会转换为字节类型,也就是二进制
print(f.readline())
c=open('file.py','wb') #写入二进制文件
c.write('我不是一个二进制文件,所以会出错'.encode()) #我们前面学过字符串转换为bytes字节类型
#encode()默认utf-8

文件修改

上面的几种方式,都是在原文件进行操作,为了避免代码错误,原文件丢失,我们可以打开两个文件,一个读取文件,一个用来写入,就是原文件只用来读取,然后写入到另一个文件

f=open('file.py','r',encoding='utf-8')
f_1=open('file1.py','w',encoding='utf-8')
for line in f:
    if '今天是星期一' in line: #判断该字符串是否在刚才循环读取的line中
        line=line.replace('今天是星期一','今天是星期一,还有五天我们就要放假啦')
         #字符串的插入方法,忘记的去前面的文章再看一下
    f_1.write(line) #line中不管有没有,都会把line写入到f_1中
f.close()

不要纠结于文件内容是什么,你可以随便写点内容进行尝试,这种方法可以在中间进行插入操作,而不是文件的末尾

Python读/写CSV文件

这里还需要介绍一下CSV文件,我们也可以把爬取到的数据保存为CSV文件,CSV文件可以用Excel或者Numders打开,得到的是可读性很高的表格。CSV文件本质上就是文本文件,但是如果直接用文本编辑器打开,可读性,就是不太好看。Python自带操作CSV的模块。使用这个模块,可以将CSV文件的内容转换为Python的字典,方便我们再次使用

Python写CSV文件

本来是准备先介绍读CSV文件的,但是我想着没有CSV文件怎么读呢,所以说你必须先知道怎么写CSV文件。Python可以把一个字典写成CSV文件,或者把一个包含字典的列表写成CSV文件。

Python写CSV文件时需要用到csv.DictWriter()这个类。它接受两个参数:第一个参数是文件对象f;第二个参数名为fieldnames,值为字典的key列表。

写入文件的列名行,就是指定表头:

writer.writeheader()

将包含字典的列表全部写入到CSV文件中:

writer.writerows(包含字典的列表)

写入单个字典:

writer.writerow(字典)

需要注意的是,写入一个包含字典的列表,每一个字典对应CSV的一行。这些字典的key必须和fieldnames相同。字典普通的无序字典,所以你不需要关心里面的顺序,但是不能存在fieldnames里面没有的Key,也不能缺少。

实例引入

import csv
#包含字典的列表
rows = [{'name':'zjj','age':18,'salary':1200},
        {'name':'wff','age':20,'salary':120000},
        {'name':'xxk','age':19,'salary':99999}]

fieldnames = ['name', 'age', 'salary']  # 定义表头字段
with open('result.csv','w',encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()  # 将表头名称写入csv文件,Excel表格嘛,带上表头
    writer.writerows(rows)  # 将要写入的数据一次性写入到文件,也可以使用cr.writerow()一次写入一行
    writer.writerow({'name':'qyl','age':22,'salary':3000})#这里我们可以再写一行

Python读CSV文件

接下来我们再来进行读CSV操作,我们在上面已经写入了一个CSV文件,然后来读取它。由于CSV文件本质上是一个文本文件,所以需要先以文本文件的方式打开,再将文件对象传递给CSV模块。

我们使用for循环到的row,你可以查看一下它的类型,就是(有序字典),也就是说我们可以直接像字典呢样使用,但是在读取文本的时候,必须把读取的代码放在缩进内部,就是with里面,出了with文件就关闭了,你还读取毛线。

import csv
with open('result.csv','r',encoding='utf-8') as f:
    reader=csv.DictReader(f)
    for row in reader:
        name=row['name'] #我们可以像操作列表呢样
        age=row['age']
        salary=row['salary']
        print('姓名:%s,年龄:%s'% (name,age))
        #你如果把print放到外面,很明显,读取的是最后一个

在这里阿我觉得需要解释一下为什么要把读取文本内容的代码放在缩进内部,这里出错的代码我就不再贴了,你把for循环拉倒外面试试,因为f变量里面的只是一个生成器,生成器只有在被使用(被迭代)的时候才会去读取文本内容。但是退出with的缩进后,文件就关闭了。你可以使用列表推导式来绕过限制,这个自行尝试。检验你会不会的真理就是去练习,用进废退嘛.

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python中的文件(File)操作 读写文件 读写CSV文件》 发布于2019-12-05

分享到:
赞(0) 赏杯咖啡

评论 3

2 + 4 =
  1. #1

    文章不错,支持一下哟…

    xingxing11个月前 (12-18)回复
    • 谢谢

      管理员众生皆甜11个月前 (12-18)
    • 测试评论邮箱回复

      管理员一语Admin9个月前 (02-24)

文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册