第8章 输入和输出
一、设置字符串格式
对于之前学习的print()\input()这些函数是针对基本的控制台I/O。
1、字符串插入
字符串插入是一种设置字符串格式的简单方法,总是采用如下格式:
format % values
其中format是包含一个或多个%字符的字符串,比如:
>>> a=8.1232387123
>>> print("value:%.2f" % a)
value:8.12
>>> print("value:%.7f" % a)
value:8.1232387
上面print()参数中的”%.2f”即一个格式设置命令,表示对要输出的数值取小数点后两位进行输出。
2、转换说明符
具体的一部分字符串转换说明符包括:d(整数)、o(八进制)、x(小写的十六进制)、X(大写的十六进制)、e(小写科学计数法)、E(大写的科学计数法)、F(浮点数)、s(字符串)等。
如:
>>> x=0.01234567890123
>>> print("%f" % x)
0.012346
>>> print("%E" % x)
1.234568E-02
也可以直接在字符串中使用格式转换符:
>>> a,b,c="cat",3.14,6
>>> s="There's %d %ss older than %.2f years" %(c,a,b)
>>> s
"There's 6 cats older than 3.14 years"
>>> s="There's %4d %ss older than %.2f years" %(c,a,b)
>>> s
"There's 6 cats older than 3.14 years"
二、格式字符串
Python中另外一种创建美观的字符串的方式是结合使用格式字符串和字符串函数
format(value,format_spec)。例如:
>>> "My {pet} has {prob}".format(pet="dog",prob="fleas")
'My dog has fleas'
>>> "My {0} has {1}".format("dog","fleas")
'My dog has fleas'
上例中format后跟的是一个元组,所以也可以直接按照元组的标号替换。
另外也可以像字符串插入那样使用转换说明符:
>>> "1/81={x}".format(x=1/81)
'1/81=0.012345679012345678'
>>> "1/81={x:f}".format(x=1/81)
'1/81=0.012346'
>>> "1/81={x:3f}".format(x=1/81)
'1/81=0.012346'
>>> "1/81={x:.3f}".format(x=1/81)
'1/81=0.012'
也可以用大括号来指定格式设置参数:
>>> "num={x:.{d}f}".format(x=1/81,d=3)
'num=0.012'
三、读写文件
文件分为两类:
1、文本文件:本质上是存储在磁盘里的字符串;
2、二进制文件:其他各种内容。
3、文本文件具有如下特点:
(1)基本上都是磁盘中的字符串,如Python源代码文件和HTML文件都属于文本文件;
(2)可以使用文本编辑器进行编辑;对于人类来说相对容易阅读和修改;
(3)对程序来说,通常难以阅读。
(4)通常比等价的二进制文件要大。
4、二进制文件具有如下特点:
(1)通常人类无法阅读,至少使用常规的文本编辑器无法查看(显示为乱码)。
(2)占据空间较小,如二进制文件可能将其保存的信息编组,每组32位,两组之间不使用分隔符;
(3)程序易读取二进制文件;通常与特定程序相关联,如果没有该程序则无法使用这些文件。
5、文件夹
大多数文件系统的文件夹结构都很复杂庞大,呈现层次型。路径名用于标识文件或文件夹的名称,完整的路径名可能非常长,Windows系统中路径名使用反斜杠’\’来分隔。
6、当前工作目录
很多程序都使用“当前工作目录”(cwd)这个概念,即默认目录。
四、检查文件和文件夹
Python中提供了很多函数用来返回有关计算机文件系中文件和文件夹的信息。如下:
(1)os.getcwd():返回当前工作目录的名称;
(2)os.listdir(p):返回一个字符串列表,其中包含路径p指定的文件夹中的所有文件和文件夹名称;
(3)os.chdir(p):将当前工作目录设置为路径p;
(4)os.path.isfile(p):当路径p指定的是一个文件的名称时返回True,否则返回False;
(5)os.path.isdir(p):当路径p指定的是一个文件夹的名称时返回True,否则返回False;
(6)os.stat(fname):返回有关fname的信息,如大小(字节为单位)和最后一次修改信息。
五、处理文本文件
1、逐行读取文本文件
#在屏幕上打印出文件的内容
def print_file1(fname):
#先把文件打开,并且指定打开模式
f=open(fname,'r')
#使用for循环以每次一行的方式读取文件
for line in f:
#文件中各行都以换行符结尾,换行符也会被读取,所以下列输出语句不必换行
print(line,end='')
#关闭文件,也可省略,Python一般会自动关闭
f.close()
print_file1("C:\\1.txt")
2、将整个文本文件作为一个字符串进行读取
def print_file2(fname):
#不指定打开模式将默认为只读模式
f=open(fname)
#直接将文本作为一个字符串使用read()读取
print(f.read())
f.close()
print_file1("C:\\1.txt")
3、写入文本文件
def make_story1():
#如果story.txt不存在则新建;如果存在则会删除并新建!
f=open("story.txt","w")
f.write("Mary had a little lamb,\n")
f.write("and then she had some more.\n")
make_story1()
import os
def make_story2():
#先检查文件是否已经存在
if os.path.isfile("story1.txt"):
print("story1.txt already exists!")
else:
f=open("story1.txt","w")
f.write("Mary had a little lamb,\n")
f.write("and then she had some more.\n")
make_story2()
4、将字符串插入到文件开头
一般采用:先将文本读取到一个字符串中,然后将新文本插入到该字符串开头,再重新将字符串写入原来的文件。
def insert_title(title,fname):
f=open(fname,"r+")
temp=f.read()
temp=title+"\n\n"+temp
#让文件指针指向文件开头
f.seek(0)
f.write(temp)
insert_title("HELLO Everybody!","story.txt")
六、处理二进制文件
二进制文件以模式“b”打开,可以访问其各个字节,例如:
def is_gif(fname):
f=open(fname,'br')
first4=tuple(f.read(4))
#所有GIF文件前4个字节都是(0x47,0x49,0x46,0x38)
if first4==(0x47,0x49,0x46,0x38):
print(fname+"是GIF格式图片!")
return True
else:
print(fname+"不是GIF格式图片!")
return False
is_gif("g1.jpg")
is_gif("story.gif")
is_gif("g2.gif")
Pickle:Python模块pickle执行的操作通常被称为对象串行化(简称串行化)。
对于较高级的应用程序编程中很少访问二进制文件的各个字节,pickle模块可以轻松读写几乎任何数据结构:
import pickle
def make_pickled_file():
grades={"alan":[4,8,10,10],
"tom":[7,7,7,8],
"dan":[5,none,7,7],
"may":[10,8,10,10]}
outfile=open("grades.dat","wb")
pickle.dump(grades,outfile)
def get_pickled_data():
infile=open("grades.dat","rb")
grades=pickle.load(infile)
return grades
七、读取网页
模块urllib提供了读取网页的相关功能:
>>> import urllib.request
>>> page=urllib.request.urlopen("http://www.python.org")
>>> html=page.read()
>>> html[:25]
b'<!doctype html>\n<!--[if l'