Python文件基本操作

Python文件基本操作

1、文件对象的属性

属性 描述
file.closed 如果文件已被关闭返回true,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.newlines 未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当 文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束 符的列表
file.encoding 返回文件的编码方式
file = open('allen.txt', 'w')
print(file.name)
print(file.mode)
print(file.encoding)
print(file.newlines)

输出结果:
allen.txt
w
UTF-8
None

2、文件的打开

文件打开是通过内置函数open(),并返回一个文件对象,

file object = open(file_name [, access_mode][, buffering])
  • file_name: file_name变量是一个包含了你要访问的文件名称的字符串值。比如:‘hello.text’

  • access_mode:访问文件的模式,只读(r),写入(w),追加(a)等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。

  • buffering:值为0,访问文件时不寄存行。值为1,访问文件时寄存行。值为大于1的正数表示指定寄存区缓冲大小。值为负数时表示寄存区缓冲大小为系统默认。

一表胜十文:

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

一图胜十表:

模式 r r+ w w+ a a+
✔️ ✔️ ✔️ ✔️
✔️ ✔️ ✔️ ✔️ ✔️
创建 ✔️ ✔️ ✔️ ✔️
覆盖 ✔️ ✔️
指针在开始 ✔️ ✔️ ✔️ ✔️
指针在结尾 ✔️ ✔️

3、文件输入

文件的输入和输出是相对应屏幕来说,从读取文件内容到屏幕上叫输入,将屏幕上内容写到文件内叫输出

3.1 read(size):

用于从文件读取指定的字节数,size:从文件中读取的字节数。如果size未给定或为负则读取所有
allen.txt文件内容

line1
line2
line3
file = open('allen.txt', 'r')
cont1 = file.read(2)
cont2 = file.read(10)
cont3 = file.read(15)
print('cont1=%s' % cont1)
print('cont2=%s' % cont2)
print('cont3=%s' % cont3)
file.close()

结果:
cont1=li

cont2=ne1
line2

cont3=line3

从结果上看,使用同一个file读取多次时,指针的位置从上一次读取的最后位置的下一个位置开始读取的。

3.2 readline()

用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。

fo = open("allen.txt", "r+")
print("文件名为: ", fo.name)

line = fo.readline()
print("读取第一行 %s" % line)

line = fo.readline(5)
print("读取的字符串为: %s" % line)
fo.close()

结果:

文件名为:  allen.txt
读取第一行 line1
读取的字符串为: line2

3.3 readlines()

用于读取剩余未读取的所有行(直到结束符 EOF)并返回列表,而不是所有行,如果碰到结束符 EOF 则返回空字符串。

fo = open("allen.txt", "r+")
print("文件名为: ", fo.name)
line = fo.readlines(1)
print("读取第一行 %s" % line)
line = fo.readlines()
print("读取剩余行: %s" % line)
fo.close()

结果:

文件名为:  allen.txt
读取第一行 ['line1\n']
读取剩余行: ['line2\n', 'line3']

使用for循环
例子1:

fo = open('allen.txt', 'r')
for line in fo.readlines():
    print(line)
fo.closed

结果:

line1

line2

line3

例子2:

fo = open('allen.txt', 'r')
for line in fo.readlines():
    print(line.strip())
fo.closed

再来看加上strip()后的结果

line1
line2
line3

从以上两个例子中可以看出,readlines()读取的时候将换行符\n也一块读取出来,需要我们自己去掉,其实read()、readline()也是一样

4、文件输出

4.1 write()

向文件中写入指定字符串。

import os

fo = open('allen.txt', 'w+')
while True:
    line = input('input content')  # input不会保留换行符,需要自己加上系统的换行符
    if line != '.':
        fo.write('%s%s' % (line, os.linesep))
    else:
        break
for line in fo.readlines():
    print(line)
fo.close()

如果我们分别输入3行:

line4
line5
line6

本来我们“allen.txt”文件中有以下三行:

line1
line2
line3

加上我们输入的3行应该是

line1
line2
line3
line4
line5
line6

运行结果:

line4
line5
line6

但结果并不是啊,原因是什么呢?还有为什么我们要加上os.linesep()

需要注意点:
1、以‘w/w+’模式打开的文件,如果文件存在则会覆盖,如果文件不存在则会新建。
2、write()和read()一样并不会操作换行符,需要使用os模块下os.linesep()加上换行符,否则只会在一行上写

4.2 writelines()

向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n。

fo = open('allen.txt', 'w+')
while True:
    line = input('input content')  # input不会保留换行符,需要自己加上系统的换行符
    if line != '.':
        fo.writeline('%s%s' % (line, os.linesep))
    else:
        break
for line in fo.readlines():
    print(line)
fo.close()

我们输入3行

line1
line2
line3

打开文件查看结果:

line1
line2
line3

5、文件定位移动

5.1 tell()

例子1:

fo = open('allen.txt', 'r')
for line in fo.readline():
    print('本行内容:%s,指针所在的位置:%d' % (line, fo.tell()))
fo.close()
本行内容:line1,指针所在的位置:6
本行内容:line2,指针所在的位置:12
本行内容:line3,指针所在的位置:18

例子2:

fo = open('allen.txt', 'r')
for line in fo.readlines():
    print('本行内容:%s,指针所在的位置:%d' % (line, fo.tell()))
fo.close()
本行内容:line1,指针所在的位置:18
本行内容:line2,指针所在的位置:18
本行内容:line3,指针所在的位置:18

从例子1和2中我们可以看出readline()读取一行,指针的位置移动一行,readlines()是一下子读取到尾部。

5.2 seek()

seek(offset[, whence]) :没有返回值
offset -- 偏移量,也就是代表需要移动字节数
whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

fo = open("allen.txt", "r+")
line = fo.readline()
print("第一次读取的数据为:%s所在的位置为:%d " % (line, fo.tell()))
# 重新设置文件读取指针到开头
fo.seek(0, 0)
line = fo.readline()
print("第二次读取的数据为:%s所在的位置为:%d " % (line, fo.tell()))
fo.closed
第一次读取的数据为:line1所在的位置为:6 
第二次读取的数据为:line1所在的位置为:6 

6、文件迭代

file对象是一个可迭代的对象,可以使用for循环进行迭代

fo = open("allen.txt", "r")
for content in fo:
    print(content)
fo.close()
line1

line2

line3

内功深厚的同学,应该发现了一个问题,上边所有的例子我们再关闭文件的时候都是直接close(),试想一下,万一中间出现异常了,close就执行不了,为了保证无论是否出错都能正确地关闭文件,我们可以使用 try ... finally :

try:
    f = open('allen.txt', 'r')
    print f.read()
finally:
    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python 引入了 with 语句来自动帮我们调用 close() 方法:

with open('allen.txt', 'r') as f:
    f.read()

是不是很简洁,有木有

猜你喜欢

转载自www.cnblogs.com/suxianglun/p/9052718.html