python3–文件操作

File文件操作

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

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

语法:

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 函数来创建:

参数1: 文件名:(如果要是直接写在脚本内最好是文件的绝对路劲)
参数2: option:  r 读  w 写   b二进制   a追加

为了配合下面的操作,利用w写入一个内容:

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中的内容为:

first lines
这是第二行
third lines
this is fourth lines
this is fifth lines

读出333.txt的内容:

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的形式来展现出来(包括每行的换行符)。

追加一行

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

返回文件名

示例:

#!/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()

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

with open("333.txt", "r", encoding=ENCODING) as f:
    f = f.read(10)
print(f)

输出:
first line
write(date)

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

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()

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

只返回第一行的内容

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,每一行是一个元素

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']
文件编码的问题:

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

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

ENCODING = "utf-8"
seek()

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

格式:

fileObject.seek(offset[, whence])

参数

  • offset: 开始的偏移量,也就是代表需要移动偏移的字节数
  • whence: 可选,默认值为0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

该函数没有返回值。

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

文件中的内容为:
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的工作模式!

下面我这样修改下:

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()

返回文件光标位置

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

输出:
1.asdadasdasdas

17

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

truncate(size)

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

源文件内容:
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参数:

源文件内容:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya

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

直接清空了文件的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏地方网络工作室的专栏

推荐一个命名变量的神奇网站 CODELF

推荐一个命名变量的神奇网站 CODELF 在我们写程序的时候,总是需要去给各种变量命名。于是各种命名大法都上来了,有拼音的,有首字母缩写的,各种各样。而我们推荐...

3017
来自专栏idba

获取没有设置TTL的key

在运维Redis的时候,总会遇到使用不规范的业务设计,比如没有对key设置ttl,进而导致内存空间吃紧,通常的解决方法是在slave上dump 出来所有的k...

972
来自专栏程序员同行者

django基础之二

1384
来自专栏码生

Linux 权限代码解析

首先说明: 数字后面为9位由字母或-组成的 每三位对应前面的一个数字 例如:755 rwx 对应第一个7 r-x 对应第二个5 r-x 对应第三个5

2084
来自专栏指尖下的Android

JNI之路径初探---2

上一篇博客写的是Java调用C、C++的例子,本篇就演示一下C、C++怎么调用Java的属性和方法。

1752
来自专栏iOS开发笔记

iOS开发之单例模式你用对了吗

、 单例在iOS开发中可以说是很常见的一种设计模式,在你的项目中或许你已经用过很多次,大家可能都会想不就是单例吗,我闭着眼睛单手就能写。是的,单例可以说是所有设...

934
来自专栏技术沉淀

命令行工具:文件初探

1363
来自专栏JMCui

基于Nginx和Zookeeper实现Dubbo的分布式服务

2604
来自专栏生信宝典

Linux学习 - 管道、标准输入输出

Linux下的标准输入、输出、重定向、管道 在Linux系统中,有4个特殊的符号,<, ‘>’, ‘|’, ‘-‘,在我们处理输入和输出时存在重要但具有迷惑性的...

3525
来自专栏游戏开发那些事

【python游戏编程之旅】第二篇--pygame中的IO、数据

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

1274

扫码关注云+社区

领取腾讯云代金券