欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python——文件I/O

程序员文章站 2022-07-01 18:11:33
...

读取键盘输入

python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。
如下:

  • raw_input
  • input

raw_input函数

raw_input([prompt]) 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
str = raw_input("请输入:")
print ("你输入的内容是: ", str)

这将提示你输入任意字符串,然后在屏幕上显示相同的字符串。当我输入"Hello Python!",它的输出如下:

请输入:Hello Python!
你输入的内容是:  Hello Python!

input函数

input([prompt]) 函数和 raw_input([prompt]) 函数基本类似,但是 input 可以接收一个Python表达式作为输入,并将运算结果返回。

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
str = input("请输入:")
print ("你输入的内容是: ", str)
这会产生如下的对应着输入的结果:

请输入:[x*5 for x in range(2,10,2)]
你输入的内容是:  [10, 20, 30, 40]

打开和关闭一个文件

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

open函数

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

file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:

  • file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
  • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。
  • buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

Python——文件I/O

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

file对象属性

一个文件被打开以后,你就有了一个file对象,你可以得到该文件的各种信息。

属性 描述
file.closed 返回Ture如果文件已被关闭,否则返回False
file.mode 返回被打开文件的访问模式
file.name 返回文件的名称

file.close()

file.close()方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作,否则会触发ValueError错误。close()方法允许调用多次。
当file对象,被引用到操作另外一个文件时,Python会自动关闭当前的file对象。使用close()关闭文件是一个很好的习惯。

file.flush()

flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
举例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "wb")
print ("文件名为: ", fo.name)

# 刷新缓冲区
fo.flush()

# 关闭文件
fo.close()

file.fileno()

filenoe()方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
举例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "wb")
print("文件名为: ", fo.name)

fid = fo.fileno()
print("文件描述符为: ", fid)

# 关闭文件
fo.close()

file.isatty()

如果将文件链接到一个终端设备返回True,否则返回False。
举例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "wb")
print "文件名为: ", fo.name
ret = fo.isatty()
print("是否连接终端设备",ret)

fo.close()

next(line)函数

Python 3 中的 File 对象不支持 next() 方法。 Python 3 的内置函数 next() 通过迭代器调用 next() 方法返回下一项。 在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration语法
语法如下:
next(iterator[,default])
参数:无
返回值:返回文件下一行。
举例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "wb")
print "文件名为: ", fo.name
reader = fo.readline()  # 读取第一行
for index in range(2,6):
    line = next(fo)
    print("第 %d 行 - %s" % (index, line))

file.read([size])

read() 方法用于从文件的当前指针位置读取指定的字节数,包括 “\n” 字符,如果未给定或为负则读取所有。size – 从文件中读取的字节数。
文件内容是:
1www.foo.com
2www.foo.com
3www.foo.com
4www.foo.com
5www.foo.com

举例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "rw+")
print ("文件名为: ", fo.name)

line = fo.read(10)
print ("读取的字符串: %s" % (line))
line = fo.read(10)
print ("读取的字符串: %s" % (line))


# 关闭文件
fo.close()

返回结果:

读取的字符串: 1www.foo.c
读取的字符串: om
2www.fo

file.readline([size])

fileObject.readline()方法用于从文件读取当前指针位置所在的整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。参数size – 从文件中读取的字节数。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "rw+")
print ("文件名为: ", fo.name)

line = fo.readline()  # 读取第一行
print("第一行字符",line) 
line = fo.readline(10)  # 从第二开始读取
print("第二行字符",line)
print(len(line))  # 打印line的长度
line = fo.readline(10)  # 读取上一次指针剩余的字符,由于剩余字符不足10,所以返回全部字符
print("第二行字符",line)
file.close()

结果:

第一行字符 1www.foo.com

第二行字符 2www.foo.c
3
第二行字符 om

file.readlines([size])

readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。如果碰到结束符 EOF 则返回空字符串。
size同样是控制长度的,但是所读取的数据必须是完整的一行。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 打开文件
fo = open("foo.txt", "rw+")
print ("文件名为: ", fo.name)
line = fo.readlines()
print(line)

for item  in line:
    print(item.strip())  # 去除字符发首尾的空白
    print(item)

file.close()

结果:

['1www.foo.com\n', '2www.foo.com\n', '3www.foo.com\n', '4www.foo.com\n', '5www.foo.com\n']
1www.foo.com
1www.foo.com

2www.foo.com
2www.foo.com

3www.foo.com
3www.foo.com

4www.foo.com
4www.foo.com

5www.foo.com
5www.foo.com

readline,read,readlines的区别

readline:从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
read:read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
readline:readlines()方法读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存

file.seek(offset[,whence])

seek()方法用于移动文件的读取指针到指定位置。
fileObject.seek(offset[, whence])参数说明:

  • offset – 开始的偏移量,也就是代表需要移动偏移的字节数

  • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算
    foo.txt内容同上

fo = open("foo.txt","r+",encoding="utf-8")
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)

line = fo.readline()
print("读取的数据为: %s" % (line))
# 重新设置文件读取指针到开头
fo.seek(0,0)
line = fo.readline()
print("读取的数据",line)


结果:

文件名 foo.txt
是否关闭 False
访问模式 r+
文件描述符 3
是否连接终端设备 False
读取的数据为: 1www.foo.com

读取的数据 1www.foo.com

file.tell()

tell()方法返回文件的当前位置,即文件指针当前的位置
foo.txt内容同上
举例:

fo = open("foo.txt","r+",encoding="utf-8")
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)

line = fo.readline(10)
print("读取的数据为: %s" % (line))
pos = fo.tell()
print("当前位子",pos)
fo.close()



结果

文件名 foo.txt
是否关闭 False
访问模式 r+
文件描述符 3
是否连接终端设备 False
读取的数据为: 1www.foo.c
当前位子 10

file.truncate([size])

fileObject.truncate( [ size ])方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
truncate()这个函数跟文件指针位置无关。每次执行都是从文件开始处执行,也就是seek(0,0)的位置开始,截取指定参数的n个字符,其它的全部删除。所以要用a+(a不行)或是r+。如果用w+模式会读出空,因为w是先删除再写,一定不要用。执行结果为,只剩文件开头的n个字符。
foo.txt内容同上

举例1:

fo = open("foo.txt","r+")
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)

line = fo.readline()
print("读取的数据为: %s" % (line))
print(fo.tell())
# 截断剩余字符
fo.truncate(10)
# 尝试再次读取数据
line = fo.readlines()
print("读取的数据为: %s" % (line))

输出:



文件名 foo.txt
是否关闭 False
访问模式 r+
文件描述符 3
是否连接终端设备 False
读取的数据为: 1www.foo.com

14
读取的数据为: ['2www.foo.com\n', '3www.foo.com\n', '4www.foo.com\n', '5www.foo.com']

文本变为:
1www.foo.c

原因是先读再写

举例2:

fo = open("foo.txt","r+")
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)
fo.truncate(10)
line = fo.read()
print("读取的数据为: %s" % (line))
print(fo.tell())
# 截断剩余字符

# 尝试再次读取数据
line = fo.readlines()
print("读取的数据为: %s" % (line))

结果:

文件名 foo.txt
是否关闭 False
访问模式 r+
文件描述符 3
是否连接终端设备 False
读取的数据为: 1www.foo.c
10
读取的数据为: []

foo.txt文本变为
1www.foo.c

** 原因是先写再读**

file.writelines(sequence)

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

当foo.txt文档为空时写入

举例


fo = open("foo.txt","r+",encoding='utf-8')
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)

seq = ["菜鸟教程 1\n", "菜鸟教程 2"]
fo.writelines(seq)



fo.close()

foo.txt文档内容变为:
菜鸟教程 1
菜鸟教程 2

当foo.txt文档不为空时写入

foo.txt原文件:
1www.foo.com
2www.foo.com
3www.foo.com
4www.foo.com
5www.foo.com

程序

fo = open("foo.txt","r+",encoding='utf-8')
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)
seq = ["菜鸟教程 1\n", "菜鸟教程 2\n"]
fo.writelines(seq)






fo.close()

结果:

菜鸟教程 1
菜鸟教程 2
.foo.com
4www.foo.com
5www.foo.com

当我们已经使用readline读取文档的时候,writelines会自动将字符串写入到文档最后
举例:
原文档:
1www.foo.com
2www.foo.com
3www.foo.com
4www.foo.com
5www.foo.com
程序:

fo = open("foo.txt","r+",encoding='utf-8')
print("文件名",fo.name)
print("是否关闭",fo.closed)
print("访问模式",fo.mode)
fid = fo.fileno()
print("文件描述符",fid)
ret = fo.isatty()
print("是否连接终端设备",ret)
print(fo.readline())
print(fo.readline())
print(fo.tell())
seq = ["菜鸟教程 1\n", "菜鸟教程 2"]
fo.writelines(seq)
print(fo.tell())

fo.close()
文档变为:
1www.foo.com
2www.foo.com
3www.foo.com
4www.foo.com
5www.foo.com
菜鸟教程 1
菜鸟教程 2