Python 输入输出

标准输出

通过Python 的内置 print 函数就能轻松实现终端上的输出

In [1]:
print("Hello World")
Hello World
In [2]:
?print()

def print(self, *args, sep=' ', end='\n', file=None):

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file:  a file-like object (stream); defaults to the current sys.stdout.
sep:   string inserted between values, default a space.
end:   string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
pass
*args           非关键字可变长参数,可以接受任意个参数,参数之间用逗号“,”分隔
sep=''          默认参数,打印参数与参数之间默认有空格
end=‘\n’        默认参数,打印后字符串结尾默认会换行。

那么接下来,让我们来看看怎么使用吧:

这里我往print里面传入了很多数字,每一个数字都是一个参数,每一个参数都要用逗号 “,” 隔开了。

In [3]:
print(0,1,2,3,4,5)
0 1 2 3 4 5

字符串也是一样的,字符串用引号包含(“ ”/‘ ’)

In [4]:
print('liangxiansen','lixiaojie','zhaoguifei','liuaiqing')
liangxiansen lixiaojie zhaoguifei liuaiqing

如果我在print里面写 1+1 呢?

In [5]:
print(1+1)
2

接下来,如果我传入一个列表呢?

In [6]:
list_1 = [1,23,'liang','xian','sen']
print(list_1)
[1, 23, 'liang', 'xian', 'sen']

列表当做一个参数传递进去,一次打印出来,所以显示list得形式。

我不想要list的形式,就想要里面的每一个元素的内容呢?

In [7]:
for n in list_1:
    print(n,end=" ")
1 23 liang xian sen 

因为print默认会在结尾加 “\n” 换行符,我们想显示在一行,可以将默认参数 end 赋值为 “ ” 空格。

还有一个很简单的形式, 使用 “*” 星号也一样可以遍历列表中的每个元素。

In [8]:
print(*list_1)
1 23 liang xian sen

命名规则

  • 变量只能包含字母、数字和下划线。变量名可以以字母或下划线开始,但不能以数字开始。
  • 在变量名称不能有空格,所以我们可以用下划线代替空格。例如,使用student_name代替“学生姓名”。
  • 你也不能使用Python关键字
  • 变量名应该是描述性的,而且不宜太长。例如"mc_wheels"和“wheels”来表示number_of_wheels_on_a_motorycle。
  • 格外小心使用小写字母l和大写字母O的地方他们可能会与数字1和0混淆。
In [9]:
# 单词之间下划线
user_name = 'liangxiansen'
user_age = 18

print(user_name, user_age)
liangxiansen 18
In [10]:
# 驼峰命名规则
UserName = 'liangxiansen'
UserAge = 18

print(UserName, UserAge)
liangxiansen 18

格式化输出

像上面输出都在一行,没有什么阅读性,我们可以使用格式化输出:

Python的字符串格式化有两种方式: 百分号方式、format方式

百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。

"%" 百分号格式化

%[(name)][flags][width].[precision]typecode

(name)      可选,用于选择指定的key

flags          可选,可供选择的值有:

  • +,       右对齐;正数前加正好,负数前加负号;
  • -,        左对齐;正数前无符号,负数前加负号;
  • 空格,    右对齐;正数前加空格,负数前加负号;
  • 0,        右对齐;正数前无符号,负数前加负号;用0填充空白处

width         可选,占有宽度

.precision   可选,小数点后保留的位数

typecode    必选

  • s,获取传入对象的str方法的返回值,并将其格式化到指定位置
  • r,获取传入对象的repr方法的返回值,并将其格式化到指定位置
  • c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
  • o,将整数转换成 八  进制表示,并将其格式化到指定位置
  • x,将整数转换成十六进制表示,并将其格式化到指定位置
  • d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
  • e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
  • E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
  • f,将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
  • F,同上
  • g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
  • G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
  • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
In [11]:
name = "liangxiansen"
age = 18
job ="programmer"

msg = """
Infomation of user %r:
-------------------
Name:   %s
Age :   %d
Job :   %s
---------End-------
"""
 
print(msg % (name, name, age, job))
Infomation of user 'liangxiansen':
-------------------
Name:   liangxiansen
Age :   18
Job :   programmer
---------End-------

接下来具体介绍 typecode 都有哪些用法:

In [12]:
"My name is %s." % name
Out[12]:
'My name is liangxiansen.'

通过上面的几个例子可以看到 “%” 百分号那个位置都被字符串 % 后面的变量所替代了

事实上,使用百分号的格式就是这样:

你需要被格式化的字符串 % 需要用来格式化的元素,如果是多个,用括号包住。

In [13]:
"My name is %s, I'm %d years old." % (name, age)
Out[13]:
"My name is liangxiansen, I'm 18 years old."

%s —— 获取传入对象的str方法的返回值,并将其格式化到指定位置

%d —— 将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置

In [14]:
"percent: %.2f%%" % 99.87557
Out[14]:
'percent: 99.88%'

.precision —— 可选,小数点后保留的位数

%f —— 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位

In [15]:
"percent: %e%%" % 99.87557
"percent: %E%%" % 99.87557
Out[15]:
'percent: 9.987557e+01%'
Out[15]:
'percent: 9.987557E+01%'

%e —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置

%E —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置

In [16]:
"oct nummber: %o" % 81
"hex number: %x" % 81
Out[16]:
'oct nummber: 121'
Out[16]:
'hex number: 51'

%o —— 将整数转换成 八 进制表示,并将其格式化到指定位置

%x —— 将整数转换成十六进制表示,并将其格式化到指定位置

接下来看看非必须标记符,怎么辅助必须标记符 typecode 实现不同的工作:

In [17]:
msg1 = """
Infomation of user %(name)s:
-------------------
Name:   %(name)s
Age :   %(age)d
Job :   %(job)s
---------End-------
"""

print(msg1 % {"name": name, "age": age, "job": job})
Infomation of user liangxiansen:
-------------------
Name:   liangxiansen
Age :   18
Job :   programmer
---------End-------

当在很大一长串字符串里面需要格式格式化的地方特别多的时候,你写很多%s ,%d ... 等,然后再最后需要格式化的时候,需要在 %( ) 里面写一大堆内容,而且要排序对应好往里面添加的时候是不是感觉特别不友好,很容易出问题,对应不上整个内容就出更期望的不一样了,如果数据类型和字符串中的标识位不一样将会程序出错。

For example:

In [18]:
"This is number : %d" % name
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-718e1695c103> in <module>()
----> 1 "This is number : %d" % name

TypeError: %d format: a number is required, not str

看报错信息,%d 标识符需要一个 number 来格式化,但是却得到了一个str? 所以它看不懂了,一懵逼就报错。

So, 上面使用百分号格式化添加 (name) 标记, 在未格式化之前也能很清晰的知道哪个位置是什么;

在格式化的时候 % 后面接受一个 dictkey 是(name)标记位的名称, value 就是需要用来格式化的内容。

flags And width

In [19]:
"This is string : %(name)-20s" % {"name": name}
"This is string : %(name)+20s" % {"name": name}
"This is number : %(num) 20.2f" % {"num": 75.678}
"This is number : %(num)+20.2f" % {"num": 75.678}
"This is number : %(num)20.2f" % {"num": -75.678}
"This is number : %(num)020.2f" % {"num": 75.678}
Out[19]:
'This is string : liangxiansen        '
Out[19]:
'This is string :         liangxiansen'
Out[19]:
'This is number :                75.68'
Out[19]:
'This is number :               +75.68'
Out[19]:
'This is number :               -75.68'
Out[19]:
'This is number : 00000000000000075.68'

看上面例子:

width 用来设置宽度,

  • 在格式化字符的时候,设置字符串的宽度
  • 在格式化数字的时候,也可以用来设置数字位数

flags 在不同的情况增加表现形式,

  • 在格式化字符的时候,- , + ,表示左右对齐, 0空格 则没有用处。
  • 在格式化数字的时候, -, + , 和 空格 为了满足正负数在格式化时候的不同表现, 0 用来给数字填充默认位数

Format 格式化

[[fill]align][sign][#][0][width][,][.precision][type]

fill 【可选】空白处填充的字符

align 【可选】对齐方式(需配合width使用)

  • <,内容左对齐
  • >,内容右对齐(默认)
  • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
  • ^,内容居中

sign 【可选】有无符号数字

  • +,正号加正,负号加负;
  • -,正号不变,负号加负;
  • 空格 ,正号空格,负号加负;

# 【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示

【可选】为数字添加分隔符,如:1,000,000

width 【可选】格式化位所占宽度

.precision 【可选】小数位保留精度

type 【可选】格式化类型

  • 传入” 字符串类型 “的参数
    • s,格式化字符串类型数据
    • 空白,未指定类型,则默认是None,同s
  • 传入“ 整数类型 ”的参数
    • b,将10进制整数自动转换成2进制表示然后格式化
    • c,将10进制整数自动转换为其对应的unicode字符
    • d,十进制整数
    • o,将10进制整数自动转换成8进制表示然后格式化;
    • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
    • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
  • 传入“ 浮点型或小数类型 ”的参数
    • e, 转换为科学计数法(小写e)表示,然后格式化;
    • E, 转换为科学计数法(大写E)表示,然后格式化;
    • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    • g, 自动在e和f中切换
    • G, 自动在E和F中切换
    • %,显示百分比(默认显示小数点后6位)

最简单的使用:

In [20]:
"I'm {}, {} years old, I like {}.".format("Kevin", 18, 'watching movies')
Out[20]:
"I'm Kevin, 18 years old, I like watching movies."

这么写是不太规范的,虽然现在运行没有问题,但是可能在低版本的python上可能会报错,所以我这里写出来。

使用format格式化的时候,在需要格式化的字符串里面写上一对花括号 { } , 然后使用 .format() 方法。 将需要用来格式化的对象以参数的形式传给format方法

但是标准的方法是下面的,在每个 { } 里面加上序号。

In [21]:
"I'm {0}, {1} years old, I like {2}.".format("Kevin", 18, 'watching movies')
Out[21]:
"I'm Kevin, 18 years old, I like watching movies."

当然还有更优雅的方式,给每个需要格式化的地方加个名字,然后每个名字就是format方法的 key ,格式化的时候使用指定的key传 value

In [22]:
"I'm {name}, {age} years old, I like {hobbies}.".format(name="Kevin", age=18, hobbies="watching movies")
Out[22]:
"I'm Kevin, 18 years old, I like watching movies."

还有高级用法,既然format接受key,value 的形式,那我们可以传一个 dict ,或者序列化一个json,都是可以的。

In [23]:
"I'm {name}, {age} years old, I like {hobbies}.".format(**{"name": "Kevin", "age": 18, "hobbies": "watching movies"})
Out[23]:
"I'm Kevin, 18 years old, I like watching movies."

你会看到 **{dict} 是不是联想到上面 *[list] 的用法。是的!

事实上,**{dict} 也会遍历dict中的内容以 (key=value,...) 的形式返回

list 的使用:

In [24]:
"i am {0}, age {1}, really {2}".format(*[1, 2, 3])
Out[24]:
'i am 1, age 2, really 3'
In [25]:
"i am {0[0]}, age {1[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
Out[25]:
'i am 1, age 22, really 3'

整数类型格式化:

In [26]:
"numbers: {num:b},{num:c},{num:d},{num:o},{num:x},{num:X}".format(num=15)
Out[26]:
'numbers: 1111,\x0f,15,17,f,F'
In [27]:
"numbers: {num:#b},{num:c},{num:#d},{num:#o},{num:#x},{num:#X}".format(num=15)
Out[27]:
'numbers: 0b1111,\x0f,15,0o17,0xf,0XF'

b,将10进制整数自动转换成2进制表示然后格式化

c,将10进制整数自动转换为其对应的unicode字符

d,十进制整数

o,将10进制整数自动转换成8进制表示然后格式化;

x,将10进制整数自动转换成16进制表示然后格式化(小写x)

X,将10进制整数自动转换成16进制表示然后格式化(大写X)

#,对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示

In [28]:
"number: {0:,d}".format(1000000000)
Out[28]:
'number: 1,000,000,000'

, 为数字添加分隔符

浮点数格式化:

In [29]:
print("float:\ne:{float:e}\nE:{float:E}\nf:{float:.2f}\nF:{float:.2F}\ng:{float:g}\nG:{float:G}".format(float=97.69345))
float:
e:9.769345e+01
E:9.769345E+01
f:97.69
F:97.69
g:97.6934
G:97.6934
In [30]:
"{0:.3%}".format(0.971234)
Out[30]:
'97.123%'
In [31]:
"{name:*^30}".format(name='liangxiansen')
"{name:*<30}".format(name='liangxiansen')
"{name:*>30}".format(name='liangxiansen')
"{num:=030}".format(num=10)
Out[31]:
'*********liangxiansen*********'
Out[31]:
'liangxiansen******************'
Out[31]:
'******************liangxiansen'
Out[31]:
'000000000000000000000000000010'

这里使用了 fillalignwidth

上面实例中:

30,表示设置30宽度,

<,^,>,分别为左对齐,居中对齐,右对齐,

*,填充空白区域

更多 format 使用方法详见官网

终端输出彩色字体

在Linux终端中,使用转义序列来进行彩色文字的显示,转义序列以ESC开头,即ASCII码下的\033,其格式为:

\033[显示方式;前景色;背景色m

显示方式、前景色、背景色至少一个存在即可。

for example:

\033[1;31;40m   1-高亮显示 31-前景色红色  40-背景色黑色
\033[0m         结尾采用终端默认设置,即取消颜色设置
In [32]:
print("\033[1;31;0m Hello World! \033[0m")
print("\033[1;31;1m Hello World! \033[0m")
print("\033[1;31;2m Hello World! \033[0m")
print("\033[1;31;4m Hello World! \033[0m")
print("\033[1;31;5m Hello World! \033[0m")
print("\033[1;31;7m Hello World! \033[0m")
 Hello World! 
 Hello World! 
 Hello World! 
 Hello World! 
 Hello World! 
 Hello World! 

"\033[0;31;0m", 无颜色

"\033[0;31;1m", 显示 \033[0;31 的颜色 当前为红色

"\033[0;31;2m", 显示 \033[0;31 的稍浅的颜色 当前为浅红色

"\033[0;31;4m", 显示 \033[0;31 的稍浅的颜色加下划线 当前为浅红色下划线

"\033[0;31;5m", 显示 \033[0;31 的稍浅的颜色并闪烁 当前为浅红色闪烁

"\033[0;31;7m", 显示 \033[0;31 的全填充颜色 当前为红色填充

前景色 颜色 背景色 颜色
30 黑色 40 黑色
31 红色 41 红色
32 绿色 42 绿色
33 黄色 43 黄色
34 蓝色 44 蓝色
35 紫色 45 紫色
36 青色 46 青色
37 白色 47 白色
In [33]:
print("\033[1;30;1m Hello World! \033[0m", "\033[1;30;47m Hello World! \033[0m")
print("\033[1;31;1m Hello World! \033[0m", "\033[1;30;41m Hello World! \033[0m")
print("\033[1;32;1m Hello World! \033[0m", "\033[1;30;42m Hello World! \033[0m")
print("\033[1;33;1m Hello World! \033[0m", "\033[1;30;43m Hello World! \033[0m")
print("\033[1;34;1m Hello World! \033[0m", "\033[1;30;44m Hello World! \033[0m")
print("\033[1;35;1m Hello World! \033[0m", "\033[1;30;45m Hello World! \033[0m")
print("\033[1;36;1m Hello World! \033[0m", "\033[1;30;46m Hello World! \033[0m")
print("\033[1;37;1m Hello World! \033[0m", "\033[1;30;40m Hello World! \033[0m")
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 
 Hello World!   Hello World! 

用户输入

通过Python 内置函数 input 实现用户的输入操作。

In [34]:
your_name = input("What's your name:")
print("Hello , %s" % your_name)
What's your name:Kevin
Hello , Kevin
In [35]:
print(type(input(">>>")))
>>>123
<class 'str'>
In [36]:
print(type(input(">>>")))
>>>abc
<class 'str'>

用户输入的不管你是数字还是字符串或者什么,都是字符串的形式保存。

根据用户输入自动生成表格:

In [37]:
user_name = input("input your name:")
user_age = input("input your age:")
user_jobe = input("input your jobe:")

message = """
Infomation of user {name}:
-------------------
Name:   {name}
Age :   {age}
Job :   {job}
---------End-------
"""

print(message.format(name=user_name, age=user_age, job=user_jobe))
input your name:Kevin
input your age:18
input your jobe:programmer

Infomation of user Kevin:
-------------------
Name:   Kevin
Age :   18
Job :   programmer
---------End-------

密文输入

用户如果输入密码这样隐私得东西,不应该在屏幕上显示输入得内容,可以使用python内建 getpass模块的 getpass 函数来实现

In [38]:
from getpass import getpass

UserName = input("Please input your name:")
Password = getpass("Please input your password:")

print("your name is :%s\npassword is :%s" % (UserName, Password))
Please input your name:liangxiansen
Please input your password:········
your name is :liangxiansen
password is :123456