Python(12)萌新也能看懂之——文件读写

来源:互联网 发布:ieee数据库 编辑:程序博客网 时间:2024/06/07 02:30

1、打开文件

file = open(‘./child.py’, ‘r’)

打开child.py文件。

第二个参数'r'表示以文本模式读取。'rb'表示以二进制格式读取,有些功能只能在二进制格式时使用。

除此之外,还有其他选项:

表格引自菜鸟教程

模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+打开一个文件用于读写。文件指针将会放在文件的开头。rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

比较需要特别注意的是:

  1. 一般读取文本文件,用'r'就可以了;
  2. 写入和读取,都有一个文件指针,这个决定文件从哪里开始读、写(下面细说);
  3. 'w'系列,只适合对 新文件 进行处理。如果你对已有文件进行处理的话,很遗憾,原文件的内容会被清空;
  4. 对已有文件进行追加的处理,应采用'a'系列,他会自动从原文件的末尾开始处理。如果该文件不存在,那么会创建一个新文件;

除此之外还有参数:

  1. encoding='gbk' 读取GBK编码的文件;

2、读取文件

str = file.read()

读取全部

str = file.readline()

读取一行(注意:这个会带上最后那个换行符

解决掉换行符的方法是:file.readline().strip(),会扔掉字符串 前、后 的空白符(比如空格、或者换行符)。

str = file.readlines()

读取所有行,这个返回的是list。

关于readlines这个API的解释:

可以加参数,表示单次读取的最大字节数。

每次读完一行都会判断一下,如果已读取的字节数大于这个数字的时候,就停止读取。

例如第一行是ab外加一个字节换行符(相当于3个字节),

那么参数为 2 的时候,读取完第一行发现已读取3个字节,3 > 2True,因此读取完第一行后会停止下来,直到下次调用的时候才会继续读取。

如果参数为 3,那么读取完第一行发现 3 > 3False,因此会继续读取第二行。

3、关闭文件

flie.close()

记得一定要关闭文件。

4、简化写法

with open('./child.py', 'r') as f:    print(f.read())

这个会自动帮你调用f.close(),但唯一问题是,他不会帮你处理异常。

所以可以用以下方法解决:

try:    with open('./abc.py', 'r') as f:        print(f.readline().strip())except Exception as e:    print('文件打开失败,原因是:', e)

输出:

文件打开失败,原因是: [Errno 2] No such file or directory: './abc.py'

5、写文件

在文件指针处开始写入。

因为'w'会覆盖原文件,因此默认是在文件开头,而'a'会在原文件末尾进行追加,因此默认是从原文件末尾开始。

file.write(str)

注意,参数必须是字符串,数字是不行的,如果是数字,可以用str()强制转换为字符串使用。

6、获取当前文件指针所在位置

f.tell()

返回值是数字(int)。

几个比较重要的概念:

  1. 文件的开头是0。('r'模式打开,还没有调用read方法);
  2. 读取和写入,都是从当前文件指针所在位置开始;
  3. 可以理解为list,第一个元素(字节)的位置为0,第二个为1,如果想从第二个字节开始读/写,那么应先把文件指针移动到f.tell()的返回值为1的地方;
  4. 'a+'模式固定在文件末尾追加,因此无论tell()返回多少,或者移动文件指针,都不影响他从文件末尾开始写。

7、移动文件指针的位置

f.seek(移动字节数, 可选相对位置)

第一个指移动相对于参考位置的位置;(结合第二个参数理解)

第二个是可选的,默认为0(即文件开头)。只有当读取模式里有'b'的时候,才可以为 12。1表示从当前文件指针位置,2表示从文件末尾。

假如参数为(1,0)(1),那么表示将文件指针移动到第二个字节的位置;

如代码:

with open('./test.txt', 'r') as f:    print(f.tell())    f.seek(1)    print(f.tell())    f.seek(1)    print(f.tell())# 0# 1# 1

假如open的时候,模式带b,即表示以字节的形式读取,那么参数二可以为非0参数。

例如,参数为(1, 1),那么会相对于当前文件指针位置移动。如代码:

with open('./test.txt', 'rb') as f:    # 第二个参数多'b'    print(f.tell())    f.seek(1)    print(f.tell())    f.seek(1, 1)    # 这行不同    print(f.tell())# 0# 1# 2

当第二个参数为2的时候,表示从文件末尾开始计算(即最后一个字符的下一个位置,例如假如只有3个字符,那么最后一个字符的下一个位置就是3)

## test.txt123## test.pywith open('./test.txt', 'rb+') as f:    f.seek(0, 2)    print(f.tell())    f.write(b'4')# 3## test.txt1234
原创粉丝点击