Python基础(六) 基础文件操作
今天学习python下对文件的基础操作,主要从open函数、File对象的属性、文件定位、简单操作、举例说明几个步骤开始学习,下面开始进入今天的主题:
一、open函数介绍
open函数主要是打开一个文件,创建一个file对象,相关的方法可以调用它进行读写 。
语法格式如下:
|
1
2
3
|
file object = open(文件名,打开文件的模式)file object = with open (文件名,打开文件的模式) as 变量名 |
两种语法格式的不同在于下面这种方法不用输入f.close()函数来关闭文件。
在介绍文件打开模式之前介绍两个python的函数:
计算机中一个字节是8位,那么在不同的字符编码占用的字节不同,在计算机中为了节省内存空间,汉字一般是用16进制表示,
UTF-8:一个汉字占计算机的三个字节
GBK:一个汉字占两个字节
bytes():将字符串转换成字节类型
|
1
2
3
4
5
6
7
8
|
n = bytes("你好", encoding="utf-8") #将字符串转换成utf-8的字节码print(n)n = bytes("你好", encoding="gbk") #将字符串转换成gbk的字节码print(n)结果:b'\xe4\xbd\xa0\xe5\xa5\xbd'b'\xc4\xe3\xba\xc3' |
str():可以将字节类型转换回字符串
|
1
2
3
4
5
|
new_str = str(bytes("你好", encoding="utf-8"), encoding="utf-8")print(new_str)结果:你好 |
下面来看一下打开文件的模式:

二、File对象的属性和方法
下面是file对象相关的所有属性的列表,举例说明这些属性的用法:

|
1
2
3
4
5
6
7
8
|
f = open('user.txt','a')print("文件名:",f.name)print("文件是否已关闭:",f.closed)f.close()结果:文件名: user.txt文件是否已关闭: False |
下面介绍一下file对象的方法:
1,file.read()
|
1
2
3
4
5
6
|
f = open('user.txt','r')print(f.read()) # 从文件中读取出字符串结果:UserName='jack'PassWord='123456' |
2,file.readline()
|
1
2
3
4
5
|
f = open('user.txt','r')print(f.readline()) #读取一行结果:UserName='jack' |
3,file.readlines()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
f = open('user.txt','r')print(f.readlines()) #把文件每一行作为一个list的一个成员,并返回这个list。结果:["UserName='jack'\n", "PassWord='123456'\n"]f = open('user.txt','r')for i in f.readlines(): #也可以通过循环调用readline()来实现的 print(i)结果:UserName='jack'PassWord='123456' |
4,file.write()
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。注意:Write()方法不在字符串的结尾不添加换行符('\n'):
|
1
2
3
4
5
6
7
8
|
f = open('user.txt','a') #追加的模式打开文件f.write("age:18\n") f.close()结果:UserName='jack'PassWord='123456'age:18 |
5,file.writelines()
用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表;
换行需要制定换行符 \n。
|
1
2
3
4
5
6
7
8
9
10
11
|
f = open('user.txt','a')print("文件名:",f.name)seq = ["age=19\n","sex=man\n"]f.writelines(seq)f.close()结果:UserName='jack'PassWord='123456'age=19sex=man |
6,file.flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
|
1
2
3
4
|
f =open('user','r+')f.write('123')f.flush() #通过强制刷新,123已经写入到文件中name = input('input:') #在这会一直等待用户输入 |
7,file.truncate( [size] )
截取文件,截取的字节通过size指定,默认为当前文件位置。
|
1
2
3
4
|
f =open('user','r+',encoding="utf-8")f.seek(3) #将指针移动到第3个位置f.truncate() #指针以后清空f.close() |
三、文件定位、重命名和删除文件
(一)、文件定位
file.tell() : 方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后。
file.seek(offset [,from]): 方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
f = open("user.txt",'r+') #读写的模式打开文件str = f.read(10)print("读取的字符串是:",str) position = f.tell() #找到当前指针位置print("指针位置:",position) position = f.seek(5,0) #将指针移动到从开头往后移动5个字节str=f.read(10)print(str)f.close()结果:读取的字符串是: weibo.com.指针位置: 10.com.cn |
(二)、重命名和删除文件
Python的os模块提供了执行文件处理操作的方法,比如重命名和删除文件。
rename()方法:rename()方法需要两个参数,当前的文件名和新文件名。
|
1
2
|
import osos.rename("user.txt","test.txt") |
remove()方法:删除文件,需要提供要删除的文件名作为参数。
|
1
2
|
import os os.remove("test.txt") #删除已经存在的文件 |
(三)、知识点拾遗
在python2.7以后with open() 可以同时打开两个文件,具体操作如下:
|
1
2
3
4
5
6
|
with open('user','r',encoding='utf-8') as f1,open('user1','w',encoding='utf-8')as f2: for line in f1: #将f1一行一行的读取出来 new_str=line.replace('haifeng','idx') #替换其中的某个字符串 f2.write(new_str)# #将替换好的文件写到新文件里os.rename('user','user.bak') #备份旧文件os.remove('user1','user') #发布新文件 |
|
1
2
3
4
5
6
7
8
9
10
11
12
|
f =open('user','r+') #以读写的方式打开文件Name=input("input:") #获取用户输入for i in f.readlines(): #已列表的方式一行一行读取文件 line = i.strip() #去除空格,空行 last_line = line.split("=") #按=号分割成新列表 if last_line[0] == 'name': #判断如果是name的参数就行替换 last_line[1] = str(Name) new_str = '='.join(last_line) #将新列表转换成字符串f.seek(0,0) #将指针调到起始位置开始f.write(new_str) #写入写字符串f.truncate() #将多余的字符删除f.close() #关闭文件 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
def fetch(args): #定义查询的函数 result=[] with open('haproxy.conf','r') as f: #以只读的方式打开文件 flag = False #定义跳出符 for line in f: #如果匹配到第一个开头是backend并且内容等于backend整条记录,跳出循环进行下一次循环 if line.strip().startswith('backend') and line.strip() == 'backend {0}'.format(args): flag = True continue #如果flag=True并且匹配到第二个backend时候,break,取第一个backend到第二个backend中间的值 if flag and line.strip().startswith('backend'): flag = False break #如果flag=True并且行的内容为空行的时候,将新纪录添加到列表里,return 列表的值 if flag and line.strip(): result.append(line.strip()) return resultdef add(backend, record): record_list = fetch(backend) #调用上面的查询函数,判断列表是否为None(空),即backend和record都不存在 if not record_list: #边写边读,在文件末尾添加新的纪录和backend with open('ha.conf', 'r') as old, open("new.conf", 'w') as new: for line in old: new.write(line) new.write("\nbackend " + backend + "\n") new.write(" " * 8 + record + "\n") else: if record in record_list: # record已经存在 pass else: # backend存在,record不存在 record_list.append(record) #先将新纪录添加到列表里 with open('haproxy.conf', 'r') as old, open('new.conf', 'w') as new: flag = False for line in old: if line.strip().startswith("backend") and line.strip() == "backend " + backend: flag = True new.write(line) for new_line in record_list: new.write(" " * 8 + new_line + "\n") #读取到第一个backend时,将backend那一行写入新文件,然后循环记录的列表,将新纪录的列表 #循环写进新文件,知道匹配到写一个backend为止 continue if flag and line.strip().startswith("backend"): flag = False new.write(line) continue if line.strip() and not flag: new.write(line) |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
def add2(backend,record): with open('haproxy.conf','r')as old,open('new.conf','w')as new: in_backend = False has_backend =False has_record = False for line in old: if line.strip().startswith('backend') and line.strip() == "backend "+backend: has_backend=True in_backend=True new.write(line) continue if in_backend and line.strip().startswith('backend'): if not has_record: new.write(" "*8 + record +'\n') new.write(line) in_backend = False continue if in_backend and line.strip() ==record: has_record =True new.write(line) continue if line.strip(): new.write(line) if not has_backend: new.write('backend '+backend+'\n') new.write(' '*8 +record +'\n')bk = "www.oldboy.org"rd = "server 100.1.7.49 100.1.7.49 weight 20 maxconn 30"add2(bk, rd) |
推荐使用第一种方法进行文件内容的更新,基础的文件操作就介绍到这里。
Python基础(六) 基础文件操作的更多相关文章
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
- Python基础知识(八)----文件操作
文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...
- Python基础7:文件操作
[ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...
- python学习笔记-(七)python基础--集合、文件操作&函数
本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...
- Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数
1. 集合 1.1 特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...
- python学习笔记三 文件操作(基础篇)
文件操作 打开文件 open(name[,mode[,buffering]]) open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉] w ...
- Python学习—基础篇之文件操作
文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...
- python基础3之文件操作、字符编码解码、函数介绍
内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: #/usr/bin/env ...
- python基础学习笔记——文件操作
文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...
随机推荐
- Jquery ajax json 值回传不了
今天调试系统的时候,MVC 框架下调用ajax 值,回传的json值获取不到,后来发现竟然是服务没开,郁闷不已,留个截图,做个纪念.
- 使用inet_ntoa() 时编译提示错误:
char*inet_ntoa(struct in_addr in)将一个IP转换成一个互联网标准点分格式的字符串. 我把 inet_ntoa 需要的头文件加上去: #include <sy ...
- Java源码——String
最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...
- react hooks 全面转换攻略(一) react本篇之useState,useEffect
useState 经典案例: import { useState } from 'react'; function Example() { const [count, setCount] = useS ...
- 基于.Net Core的API框架的搭建(4)
6.加入日志功能 日志我们选用log4net,首先引入程序包: 选择2.0.8版本安装.然后在项目根目录新增log4net的配置文件log4net.config: <?xml version=& ...
- C语言小项目-基于TCP协议和SOCKET编程的网络通信系统
1.1 功能结构图 网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务 ...
- GIT学习之路第五天 分支管理
本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 5.1创建与合并分支 首先创建dev分支,然后切换dev分支 $git checkout -b dev(包含创建并切换) 等价于<-&g ...
- .Net MVC 前台验证跟后台验证
前台验证: 首先你得有一个参数类,参数类代码如下 验证标记总结 [DisplayName("邮箱:")] [Required(ErrorMessage = " ...
- Apache Calcite项目简介
文章导读: 什么是Calcite? Calcite的主要功能? 如何快速使用Calcite? 什么是Calcite Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功 ...
- elasticsearch 查询优化
首先对不必要的字段不做分词也就是不做索引,禁止内存交换 1.shard 一个Shard就是一个Lucene实例,是一个完整的搜索引擎. 分片数过多会导致检索时打开比较多的文件,多台服务器之间通讯成本加 ...