今天学习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=19
sex=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 os
os.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 result
 
def 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基础(六) 基础文件操作的更多相关文章

  1. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  2. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  3. Python基础知识(八)----文件操作

    文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...

  4. Python基础7:文件操作

    [ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...

  5. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  6. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  7. python学习笔记三 文件操作(基础篇)

    文件操作 打开文件 open(name[,mode[,buffering]])   open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉]   w ...

  8. Python学习—基础篇之文件操作

    文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...

  9. python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: #/usr/bin/env ...

  10. python基础学习笔记——文件操作

    文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...

随机推荐

  1. 用React & Webpack构建前端新闻网页

    这是一篇给初学者的教程, 在这篇教程中我们将通过构建一个 Hacker News 的前端页面来学习 React 与 Webpack. 它不会覆盖所有的技术细节, 因此它不会使一个初学者变成大师, 但希 ...

  2. C#面向过程之类型转换、算术运算符、关系运算符、逻辑运算符、if-else语句、switch-case、循环结构(while、for)、三元表达式

    数据类型转换: int.parse()只能转换string类型的 当参数为null时会报异常int i =Convert.ToInt32(false) 运行结果是0int i =Convert.ToI ...

  3. springboot根据yml配置文件选择性加载bean

    @Slf4j @Aspect @Component @ConditionalOnProperty(value = "localCache.apiCache", havingValu ...

  4. JS自定义右键菜单案例

    要求:点击页面鼠标右键,阻止默认右键菜单的弹出,并弹出自定义右键菜单. 效果示例: 参考代码: <!DOCTYPE html> <html lang="zh-CN" ...

  5. 《Maven实战》(许晓斌)导读(读书笔记&第二次读后感)

    第一章 Maven简介 Maven是构建工具,但同时还是jar包管理工具.项目信息管理工具 与Make.Ant比较,更为先进 第二章 Maven的安装和配置 Windows和Unix上安装都很简单,下 ...

  6. 士兵杀敌 三 --- O( 1 ) 的时间复杂度 .

    一看就是 十分简单的  题  ,   然后上去开始无脑程序 超时~~~      感觉时间复杂度 , 已经很低了  ,  但是并没有什么卵用 . #include<stdio.h> #in ...

  7. Entityframework Code First 系列

    总篇, 下面会添加每个小篇的链接. 目录如下: 项目搭建 ……

  8. Android基础TOP5_2:MultiAutoCompleteTextView多文本自动补全文本框

    Activity: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  9. 【C++】朝花夕拾——中缀转后缀

    对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果 ==================================我是分割线======================= ...

  10. JMeter在linux上分布式压测步骤(二)

    哈喽,我又来了~ 前提:三台linux虚拟机,一台作为master,另外两台作为slave. 一.server端 1.修改1099端口,client和server通信的端口,可以不修改,默认就是109 ...