Python——文件I/O
读取键盘输入
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+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
模式 | 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