声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!
Python输入和输出
输出格式美化
Python三种输出值的方式
- 表达式语句
- print() 函数
- 文件对象的 write() 方法
如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值
如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现
-
str(): 函数返回一个用户易读的表达形式
-
repr(): 产生一个解释器易读的表达形式
字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格
还有类似的方法, 如 ljust() 和 center(), 这些方法并不会写任何东西, 它们仅仅返回新的字符串
另一个方法 zfill(), 它会在数字的左边填充 0
str.format()
str.format() 的基本使用如下:
- 括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换
>>> print('{}网址: "{}!"'.format('菜鸟教程', 'www.runoob.com'))
菜鸟教程网址: "www.runoob.com!"
- 在括号中的数字用于指向传入对象在 format() 中的位置
>>> print('{0} 和 {1}'.format('Google', 'Runoob'))
Google 和 Runoob
>>> print('{1} 和 {0}'.format('Google', 'Runoob'))
Runoob 和 Google
- 如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数
>>> print('{name}网址: {site}'.format(name='菜鸟教程', site='www.runoob.com'))
菜鸟教程网址: www.runoob.com
- 位置及关键字参数可以任意的结合
>>> print('站点列表 {0}, {1}, 和 {other}'.format('Google', 'Runoob', other='Taobao'))
站点列表 Google, Runoob, 和 Taobao
-
!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化
>>> import math
>>> print('常量 PI 的值近似为: {}'.format(math.pi))
常量 PI 的值近似为: 3.141592653589793
>>> print('常量 PI 的值近似为: {!r}'.format(math.pi))
常量 PI 的值近似为: 3.141592653589793
- 可选项
:
和格式标识符
可以跟着字段名,这就允许对值进行更好的格式化
>>> **import** math
>>> **print**('常量 PI 的值近似为 {0:.3f}'.format(math.pi)) # 将Pi保留到小数点后三位
常量 PI 的值近似为 3.142
- 在
:
后传入一个整数, 可以保证该域至少有这么多的宽度,用于美化表格时很有用
>>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
>>> for name, number in table.items():
... print('{0:10} ==> {1:10d}'.format(name, number))
...
Google ==> 1
Runoob ==> 2
Taobao ==> 3
如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会很方便
最简单的就是传入一个字典, 然后使用方括号 [ ] 来访问键值
>>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
>>> print('Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
Runoob: 2; Google: 1; Taobao: 3
也可以通过在 table 变量前使用 ** 来实现相同的功能:
>>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
>>> print('Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))
Runoob: 2; Google: 1; Taobao: 3
旧式字符串格式化
% 操作符也可以实现字符串格式化,它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串(现已不再建议使用)
因为 str.format() 是比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format()
读取键盘输入
Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘
input 可以接收一个Python表达式作为输入,并将运算结果返回
str = input("请输入:");
print ("你输入的内容是: ", str)
这会产生如下的对应着输入的结果:
请输入:菜鸟教程 #此处的“菜鸟教程”是从键盘输入的
你输入的内容是: 菜鸟教程
Python文件方法
open() 将会返回一个 file 对象,基本语法格式如下
open(filename, mode)
- filename:包含了你要访问的文件名称的字符串值
- mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®
不同模式打开文件的完全列表:
模式 |
描述 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 |
w |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
模式 |
r |
r+ |
w |
w+ |
a |
a+ |
读 |
+ |
+ |
|
+ |
|
+ |
写 |
|
+ |
+ |
+ |
+ |
+ |
创建 |
|
|
+ |
+ |
+ |
+ |
覆盖 |
|
|
+ |
+ |
|
|
指针在开始 |
+ |
+ |
+ |
+ |
|
|
指针在结尾 |
|
|
|
|
+ |
+ |
实例:
f = open("/tmp/foo.txt", "w") # 打开一个文件
f.write( "Python 是一个非常好的语言" )
f.close() # 关闭打开的文件
此时打开文件 foo.txt,显示如下:
Python 是一个非常好的语言
open的完整语法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
文件对象常用方法
以下假设已经创建了一个名为 f 的文件对象,假设foo.txt 已存在
f.read()
为了读取一个文件的内容,调用 f.read(size),这将读取一定数目的数据,然后作为字符串或字节对象返回
size 是一个可选的数字类型的参数,当 size 被忽略了或者为负,那么该文件的所有内容都将被读取并且返回
f = open("/tmp/foo.txt", "r") # 打开一个文件
str = f.read() # 读取全部内容
print(str)
f.close() # 关闭打开的文件
f.readline()
f.readline() 会从文件中读取单独的一行,换行符为 ‘\n’,f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行
f = open("/tmp/foo.txt", "r")
str = f.readline()
print(str) # 输出一行
f.close()
f.readlines()
f.readlines() 将返回该文件中包含的所有行
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割
f = open("/tmp/foo.txt", "r")
str = f.readlines()
print(str)
f.close()
另一种方式是迭代一个文件对象然后读取每行
f = open("/tmp/foo.txt", "r")
for line in f:
print(line, end='')
f.close()
这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用
f.write()
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数
f = open("/tmp/foo.txt", "w")
num = f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" ) # 向文件中写入字符串
print(num) # 输出写入的字符数
f.close()
如果要写入一些不是字符串的东西, 那么将需要先进行转换
f = open("/tmp/foo1.txt", "w")
value = ('www.runoob.com', 14) # value是元组
s = str(value) # 类型转换为字符串
f.write(s)
f.close()
f.tell()
f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数
f.seek()
如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数
from_what 的值,如果是 0 表示开头,如果是 1 表示当前位置,2 表示文件的结尾
- seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
- seek(x,1) : 表示从当前位置往后移动x个字符
- seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头。下面给出一个完整的例子:
>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # 移动到文件的第六个字节
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 移动到文件的倒数第三字节
13
>>> f.read(1)
b'd'
f.close()
在文本文件中 (那些打开文件的模式下没有 b 的),只会相对于文件起始位置进行定位
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件,而且写起来也比 try - finally 语句块要简短:
with open('/tmp/foo.txt', 'r') as f: # 使用该方法创建文件对象 f ,f 用完后会自动关闭
read_data = f.read()
# 不需要再手写 f.close()
file对象完整方法
序号 |
方法及描述 |
1 |
file.close():关闭文件。关闭后文件不能再进行读写操作 |
2 |
file.flush():刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入 |
3 |
file.fileno():返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上 |
4 |
file.isatty():如果文件连接到一个终端设备返回 True,否则返回 False |
5 |
file.read([size]):从文件读取指定的字节数,如果未给定或为负则读取所有 |
6 |
file.readline([size]):读取整行,包括 “\n” 字符 |
7 |
file.readlines([sizeint]):读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区 |
8 |
file.seek(offset[, whence]):移动文件读取指针到指定位置 |
9 |
file.tell():返回文件当前位置 |
10 |
file.truncate([size]):从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小 |
11 |
file.write(str):将字符串写入文件,返回的是写入的字符长度 |
12 |
file.writelines(sequence):向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符 |
pickle 模块
python的pickle模块实现了基本的数据序列和反序列化
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象
基本接口:
pickle.dump(obj, file, [,protocol]) # 序列化对象,将对象obj保存到文件file中去
- 参数protocol是序列化模式
- 0(默认):ASCII协议,表示以文本的形式进行序列化
- 1:以老式的二进制协议进行序列化
- 2:以新二进制协议进行序列化
- file:保存到的类文件对象
- file必须有write()接口
- file可以是一个以’w’打开的文件或者是一个StringIO对象,也可以是任何可以实现write()接口的对象
- obj:需要被序列化的对象
x = pickle.load(file) # 对file中的数据流进行反序列化,将其转化为python对象
- file中有read()接口和readline()接口
实例:
# 该文件名为CS.py
import pickle
class CS: # 测试类
def outputCS(self):
print('CS测试成功')
output = open('data.pkl', 'wb')
pickle.dump(CS(),output,2) # 序列化一个CCSS对象并存储到文件
output.close()
import pickle
import CS # CS类的定义在该文件中,缺少类定义会导致无法正常反序列化
pkl_file = open('data.pkl', 'rb')
data = pickle.load(pkl_file) # 从文件中读取并反序列化为一个python对象
data.outputCS() #调用CS类中的方法
pkl_file.close()
运行结果:“CS测试成功”
Python OS 文件/目录方法
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
序号 |
方法及描述 |
1 |
os.access(path, mode):检验权限模式 |
2 |
os.chdir(path):改变当前工作目录 |
3 |
os.chflags(path, flags):设置路径的标记为数字标记 |
4 |
os.chmod(path, mode):更改权限 |
5 |
os.chown(path, uid, gid):更改文件所有者 |
6 |
os.chroot(path):改变当前进程的根目录 |
7 |
os.close(fd):关闭文件描述符 fd |
8 |
os.closerange(fd_low, fd_high):关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 |
os.dup(fd):复制文件描述符 fd |
10 |
os.dup2(fd, fd2):将一个文件描述符 fd 复制到另一个 fd2 |
11 |
os.fchdir(fd):通过文件描述符改变当前工作目录 |
12 |
os.fchmod(fd, mode):改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限 |
13 |
os.fchown(fd, uid, gid):修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定 |
14 |
os.fdatasync(fd):强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息 |
15 |
os.fdopen(fd[, mode[, bufsize]]):通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 |
os.fpathconf(fd, name):返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它) |
17 |
os.fstat(fd):返回文件描述符fd的状态,像stat() |
18 |
os.fstatvfs(fd):返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs() |
19 |
os.fsync(fd):强制将文件描述符为fd的文件写入硬盘 |
20 |
os.ftruncate(fd, length):裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小 |
21 |
os.getcwd():返回当前工作目录 |
22 |
os.getcwdu():返回一个当前工作目录的Unicode对象 |
23 |
os.isatty(fd):如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False |
24 |
os.lchflags(path, flags):设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 |
os.lchmod(path, mode):修改连接文件权限 |
26 |
os.lchown(path, uid, gid):更改文件所有者,类似 chown,但是不追踪链接 |
27 |
os.link(src, dst):创建硬链接,名为参数 dst,指向参数 src |
28 |
os.listdir(path):返回path指定的文件夹包含的文件或文件夹的名字的列表 |
29 |
os.lseek(fd, pos, how):设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 |
os.lstat(path):像stat(),但是没有软链接 |
31 |
os.major(device):从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field) |
32 |
os.makedev(major, minor):以major和minor设备号组成一个原始设备号 |
33 |
os.makedirs(path[, mode]):递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹 |
34 |
os.minor(device):从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field ) |
35 |
os.mkdir(path[, mode]):以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制) |
36 |
os.mkfifo(path[, mode]):创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 |
os.mknod(filename[, mode=0600, device]):创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe) |
38 |
os.open(file, flags[, mode]):打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 |
os.openpty():打开一个新的伪终端对。返回 pty 和 tty的文件描述符 |
40 |
os.pathconf(path, name):返回相关文件的系统配置信息 |
41 |
os.pipe():创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 |
os.popen(command[, mode[, bufsize]]):从一个 command 打开一个管道 |
43 |
os.read(fd, n):从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串 |
44 |
os.readlink(path):返回软链接所指向的文件 |
45 |
os.remove(path):删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory |
46 |
os.removedirs(path):递归删除目录 |
47 |
os.rename(src, dst):重命名文件或目录,从 src 到 dst |
48 |
os.renames(old, new):递归地对目录进行更名,也可以对文件进行更名 |
49 |
os.rmdir(path):删除path指定的空目录,如果目录非空,则抛出一个OSError异常 |
50 |
os.stat(path):获取path指定的路径的信息,功能等同于C API中的stat()系统调用 |
51 |
os.stat_float_times([newvalue]):决定stat_result是否以float对象显示时间戳 |
52 |
os.statvfs(path):获取指定路径的文件系统统计信息 |
53 |
os.symlink(src, dst):创建一个软链接 |
54 |
os.tcgetpgrp(fd):返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 |
os.tcsetpgrp(fd, pg):设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg |
56 |
os.ttyname(fd)返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常 |
57 |
os.unlink(path)删除文件路径 |
58 |
os.utime(path, times):返回指定的path文件的访问和修改的时间 |
59 |
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])输出在文件夹中的文件名通过在树中游走,向上或者向下 |
60 |
os.write(fd, str):写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
61 |
os.path 模块:获取文件的属性信息 |