前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python3–文件操作

python3–文件操作

作者头像
老七Linux
发布2018-05-09 17:21:10
发布2018-05-09 17:21:10
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

File文件操作

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 open 函数

必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。

语法:
代码语言:javascript
代码运行次数:0
运行
复制
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

以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

rb

以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。

r+

打开一个文件用于读写。文件指针将会放在文件的开头。

rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。

w

打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

w+

打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+

打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

总结如下图:

模式

r

r+

w

w+

a

a+

创建

覆盖

指针在开始

指针在结尾

file 对象使用 open 函数来创建:

代码语言:javascript
代码运行次数:0
运行
复制
参数1: 文件名:(如果要是直接写在脚本内最好是文件的绝对路劲)
参数2: option:  r 读  w 写   b二进制   a追加
为了配合下面的操作,利用w写入一个内容:
代码语言:javascript
代码运行次数:0
运行
复制
ENCODING = "utf-8"          //全局变量,定义字符类型

fw = open("333.txt", "w", encoding=ENCODING)      //格式

fw.write("first lines\n这是第二行\nthird lines\nthis is fourth lines\nthis is fifth lines\n")      

print(fw)

文件1.txt中的内容为:

代码语言:javascript
代码运行次数:0
运行
复制
first lines
这是第二行
third lines
this is fourth lines
this is fifth lines
读出333.txt的内容:
代码语言:javascript
代码运行次数:0
运行
复制
fr = open("333.txt", "r", encoding=ENCODING)
fr = fr.readlines()
print(fr)

输出的内容:
['first lines\n', '这是第二行\n', 'third lines\n', 'this is fourth lines\n', 'this is fifth lines\n', '\n']

也就是说:当读一个文件的时候,会强制的将每行的内容转换为list的形式来展现出来(包括每行的换行符)。

追加一行
代码语言:javascript
代码运行次数:0
运行
复制
fr = open("333.txt", "a", encoding=ENCODING)
fr.write("\nthis is sixth lines.\n")
fr.close()

文件内容:
first lines
这是第二行
third lines
this is fourth lines
this is fifth lines
this is sixth lines.

当然我们细看最后一行,有个参数,fr.close(); 因为文件的操作,分为三个步骤:

  • 打开文件 //打开冰箱门
  • 操作 //把大象装进冰箱
  • 关闭文件 //关闭冰箱门

所以一个规范且有完整的操作,包含如上三个步骤。

file 对象属性

一旦文件被打开,则就会有一个文件对象,你就可以得到有关该文件的各种信息。

这里是一个文件对象相关的所有属性的列表:

属性

描述

file.closed

如果文件被关闭返回true,否则为false

file.mode

返回文件打开访问模式

file.name

返回文件名

示例:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 4/12/2018 8:53 PM
# @Author  : zhdya
# @File    : demon1.py

fr = open("333.txt", "r", encoding=ENCODING)
print("name of file: ", fr.name)
print("name of permission: ", fr.mode)
print("if closed or not: ", fr.closed)
fr.close()

输出:
name of file:  333.txt
name of permission:  r
if closed or not:  False

正常的工作环境中,我们一般不使用如上的步骤,但是基础学习还是有必要的,因为在日常的工作中,我们常常会忘记关闭文件,导致错误。

所以就用到了如下“自动化开启→操作→关闭”

先讲一下文件的各个方法:

方法

描述

file.close()

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

file.flush()

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

file.fileno()

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

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 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

file.writelines(sequence)

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

继续接着上面的333.txt

主要讲到几个经常用的:
read()

在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "r", encoding=ENCODING) as f:
    f = f.read(10)
print(f)

输出:
first line
write(date)

把字符串data写入到文件中,只接受字符串参数

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "w", encoding=ENCODING) as f:
    f.write("this is sss lines\nasdasdasd\n")
print(f)

再次查看文件内容:
this is sss lines
asdasdasd

这样就验证了,之前所说的,w操作会覆盖原有的文件!需要谨慎!!

readline()

每次读取文件一行数据,返回每行的字符串数据

只返回第一行的内容

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "r+", encoding=ENCODING) as f:
    f.write("this is sss lines\nasdasdasd\n")
    f = f.readline()
print(f)

输出:
this is sss lines

注意如上mode的变化  r+

文件内容变化:
this is sss lines
asdasdasd
this is sss lines
asdasdasd
readlines()

读取文件内容,返回一个list,每一行是一个元素

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "r+", encoding=ENCODING) as f:
    f.write("this is sss lines\nasdasdasd\n")
    f = f.readlines()
print(f)

输出:
['this is sss lines\n', 'asdasdasd\n', 'this is sss lines\n', 'asdasdasd\n']
文件编码的问题:

还是一贯的养成一个好的习惯,在操作文件的时候在最顶处直接添加全局变量:

全局变量:也要养成好的习惯 全局变量均 全部字符为大写。

代码语言:javascript
代码运行次数:0
运行
复制
ENCODING = "utf-8"
seek()

方法用于移动文件读取指针到指定位置。

格式:

代码语言:javascript
代码运行次数:0
运行
复制
fileObject.seek(offset[, whence])
参数
  • offset: 开始的偏移量,也就是代表需要移动偏移的字节数
  • whence: 可选,默认值为0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

该函数没有返回值。

验证这个参数 我需要重新编辑一个特殊的文件,才可以看到效果:

代码语言:javascript
代码运行次数:0
运行
复制
文件中的内容为:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya

脚本为:
with open("333.txt", "r+", encoding=ENCODING) as f:
    print(f.readline())
    print(f.readline())
    
输出:
1.asdadasdasdas

2.aaaaaaaaaa

这样也清楚了readline的工作模式!

下面我这样修改下:

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "r+", encoding=ENCODING) as f:
    print(f.readline())
    f.seek(0,0)
    print(f.readline())
    
输出:
1.asdadasdasdas

1.asdadasdasdas

这个就是seek的方法的功能!

tell()

返回文件光标位置

代码语言:javascript
代码运行次数:0
运行
复制
with open("333.txt", "r+", encoding=ENCODING) as f:
    print(f.readline())
    print(f.tell())

输出:
1.asdadasdasdas

17

还不清楚的话,就查查字符就晓得什么意思了。

truncate(size)

只有写文件才可以用,清空文件, size表示截取的字符数

代码语言:javascript
代码运行次数:0
运行
复制
源文件内容:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya

with open("333.txt", "r+", encoding=ENCODING) as f:
    f.truncate(17)

再次查看文件内容:

1.asdadasdasdas

不加size参数:

代码语言:javascript
代码运行次数:0
运行
复制
源文件内容:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya

with open("333.txt", "r+", encoding=ENCODING) as f:
    f.truncate()

直接清空了文件的内容。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/04/13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • File文件操作
    • 语法:
    • 不同模式打开文件的完全列表:
    • 总结如下图:
    • 为了配合下面的操作,利用w写入一个内容:
    • 读出333.txt的内容:
    • 追加一行
    • file 对象属性
    • 先讲一下文件的各个方法:
    • 主要讲到几个经常用的:
      • read()
      • write(date)
      • readline()
      • readlines()
      • 文件编码的问题:
      • seek()
    • 参数
      • tell()
      • truncate(size)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档