day3_文件操作
对文件的操作:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件。
一、open函数
1、语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
二、模式说明:
r:以只读方式打开文件。文件指针会放在文件的开头。这是默认模式,打卡文件不存在的话,会报错
w: 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
r+:打开一个文件用于读写。文件指针将会放在文件的开头。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
其他说明:
1、w+模式,read()方法会清空文件
- f = open('users.txt','w+',encoding='utf-8') #w+模式打开文件
- print(f.read()) #读不出来任何内容,反而会把文件中内容清空
2、r+模式,先读后写,没有将前面内容清空,因为指针读完在最后
- f = open('users.txt','r+',encoding='utf-8') #w+模式打开文件
- print(f.read()) #读完指针在最后
- f.write('AAA') #前面内容么有清空,在文件后面填上了AAA
三、常用方法汇总(牛牛杂货铺):
f = open('file.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码
1、 flush() 方法
是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。
语法
flush() 方法语法如下:
fileObject.flush()
参数:无
返回值:没有
2、close()方法
新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
3、write()方法
用于向文件中写入指定字符串。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。
write()方法不会在字符串的结尾添加换行符('\n'):
语法:fileObject.write( [ str ])
参数:str -- 要写入文件的字符串。
返回值:返回的是写入的字符长度。
- f = open('users.txt','w+',encoding='utf-8') #打开文件
- print(f.write('加入')) #返回写入的字符串长度
- f.seek(0) #w+将原内容清楚,写入,指针在最末尾,所以移到最前面才能读出来
- print(f.read())
结果:
- 2
- 加入
4、writelines()
用于向文件中写入一序列的字符串。(元素必须是字符串)
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n。
语法
writelines() 方法语法如下:
fileObject.writelines(iterable)
参数:iterable -- 可迭代对象(字符串、列表、元祖、字典)。
返回值:没有返回值
- f = open('users.txt','a+',encoding='utf-8') #打开文件
- str1 = 'abc\n'
- list1 = ['a','b','c','\n']
- tupl1 = ('a','b','c','\n')
- dict1 = {'a':1,'b':2}
- res = f.writelines(str1) #迭代写入字符串字符
- res = f.writelines(list1) #迭代写入列表元素
- res = f.writelines(tupl1) #迭代写入元组元素
- res = f.writelines(dict1) #迭代写入字典的key
- f.seek(0)
- print(f.read())
结果:
- abc
- abc
- abc
- ba
如果序列中不是字符串
- f = open('users.txt','a+',encoding='utf-8') #打开文件
- list2 = [1,2,3]
- tupl2 = (1,2,3)
- dict2 = {1:1,2:2}
- res = f.writelines(list2)
- res = f.writelines(tupl2)
- res = f.writelines(dict2)
结果报错:TypeError: write() argument must be str, not int
5、read()方法
从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
语法:fileObject.read( size );
参数:size -- 这是从文件中读取的字节数。
返回值:此方法返回读取的字节数的字符串形式
- f = open('users.txt') #打开相对目录下文件,默认模式r
- print(f.read()) #可以读出users.txt里的全部内容
- f = open('users.txt',encoding='utf-8') #如果文件里有中文,写上encoding='utf-8
- print(f.read())
- f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义)
- print(f.read())
6、readline()
方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字符数,包括 "\n" 字符。
语法
readline() 方法语法如下:
fileObject.readline([size])
参数:size -- 从文件中读取的字符数。
- f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义)
- print(f.readline()) #第一行被打印出来
- print(f.readline()) #第二行被打印出来
输出结果:
- 111
- 22222222
备注:源文件中111与22222222之间没有空行,但是为什么打印出空行来了呢?
原因:python 中print()非常友好,会自动读取换行符打印换行,
- >>> f = open(r'E:\nhy\users.txt.txt',encoding='utf-8')
- >>> f.readline() #没有print,输的字符串中包含换行符
- '111\n'
- >>> f = open(r'E:\nhy\users.txt.txt',encoding='utf-8')
- >>> print(f.readline()) #print()会非常友好,将换行符自动当换行符使用了,所以111下面出了一行空行
- 111
7、readlines()
用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。
如果碰到结束符 EOF 则返回空字符串。
语法:fileObject.readlines()
参数:无
返回值:返回列表,包含所有的行。
- f = open('users.txt',encoding='utf-8') #打开文件
- print(f.readlines()) #返回列表
输出结果:
- ['test1,123456\n', 'test2,34545\n', '联系,23424']
8、seek() 方法
用于移动文件读取指针到指定位置。
语法:fileObject.seek(offset[,whence])
参数说明:
offset -- 偏移量,也就是代表需要移动偏移的字节数,注意是按照字节算的,字符编码存每个字符所占的字节长度不一样。
如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节。
whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
实例:
- f = open('user.txt','w+')
- f.write('alsdkjfklasdf')
- f.seek(0) #写完之后,指针在最末尾,需要把指针放到最前面才能读出来全部内容
- print(f.read())
- f.close()
输出:
alsdkjfklasdf
9、replace() 方法
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
语法:str.replace(old, new[, max])
参数:
- old -- 将被替换的子字符串。
- new -- 新字符串,用于替换old子字符串。
- max -- 可选字符串, 替换不超过 max 次
返回值:返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。
- str1 = 'abc'
- res = str1.replace('abc','ABC') #替换字符串中的abc为ABC,返回一个新字符串
- print(res) #打印新字符串
结果:
- ABC
四、with使用:
在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,注意with下面的语句需要缩进,使用方式如下:
举例1:
- with open('file_test','r',encoding='utf-8') as f:
- print(f.tell()) #获取file_test文件指针指向
- print(f.readline())
- print(f.tell())
- 举例2:
- with open('file_test','r',encoding='utf-8') as f: #打开一个文件,把这个文件的句柄付给f
- for line in f:
- print(line)
- 举例3:
- with open('file_test','r',encoding='utf-8') as fr,open('file_test_bat.txt','w',encoding='utf-8') as fw:#多个文件操作,读file_test文件,写入file_test_bat文件,file_test_bat没有自动创建
- for line in fr:#循环每一行
- fw.write(line)#写到file_test_bat文件中
- with open('file_test_bat.txt','r',encoding='utf-8') as fw:#读一下复制出来的文件
- print(fw.read())
五、二进制模式文件 模式后面加上b
- f = open('Chrysanthemum.jpg','rb')
- print(f.read())
使用strip()函数去掉每行结束的\n
例如:
1)
for line in file.readlines():
line=line.strip('\n')
2)
- #读取 ip地址文件 写入 ip_address 列表
ip_address = []
with open('ip.txt', 'r') as f1:
for ip in f1.readlines():
if ip != None:
# 从文件中读取行数据时,会带换行符,使用strip函数去掉 换行符后存入列表
ip_address.append(ip.strip("\n"))
f1.close()
day3_文件操作的更多相关文章
- 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档
.net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...
- 野路子出身PowerShell 文件操作实用功能
本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...
- Node基础篇(文件操作)
文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...
- 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)
========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...
- SQL Server附加数据库报错:无法打开物理文件,操作系统错误5
问题描述: 附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- Linux文件操作的主要接口API及相关细节
操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...
- C语言的fopen函数(文件操作/读写)
头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: FILE * fopen(const char * path, c ...
- Python的文件操作
文件操作,顾名思义,就是对磁盘上已经存在的文件进行各种操作,文本文件就是读和写. 1. 文件的操作流程 (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 现有 ...
随机推荐
- python 中的map,dict,lambda,reduce,filter
1.map(function,sequence) 对sequence 中的item依次执行function(item), 见执行结果组成一个List返回 例如: #!/usr/bin/python # ...
- Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- 【iCore4 双核心板_ARM】例程二十一:LWIP_TCP_SERVER实验——以太网数据传输
实验现象: 核心代码: int main(void) { system_clock.initialize(); led.initialize(); adc.initialize(); delay.in ...
- YouTube上最火的十个大数据视频
http://blog.jobbole.com/84148/ YouTube上最火的十个大数据视频
- npm WARN unmet dependency错误解决方法
在MAC上安装webpack以及reactjs等其它组件时,安装太慢卡住不动,直接ctrl+c终止后,再npm install后出npm WARN unmet dependency错误,npm cac ...
- Java知多少(77)日期和时间类
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
- Go指南练习_斐波纳契闭包
源地址 https://tour.go-zh.org/moretypes/26 一.题目描述 让我们用函数做些好玩的事情. 实现一个 fibonacci 函数,它返回一个函数(闭包),该闭包返回一个斐 ...
- @ResponseBody的作用
由于之前一直用struts2,对springMvc的注解并不太了解.新公司的项目用的是springMvc+hibernate,看到了@ResponseBody注解 @ResponseBody作用类似于 ...
- [OpenCV] Samples 17: Floodfill
一种聚类方式,代码解析 #!/usr/bin/env python ''' Floodfill sample. Usage: floodfill.py [<image>] Click on ...
- [PyData] 01 - Web Crawler
前言 一.总体策略 一些常见抓取数据的例子.三步走: 抓取数据并存储 <---- 数据处理 数据展示 二.学习资源 首先,通过Beautiful Soup抓取数据 from http://www ...