Python 编程/输入和输出
Python 3.x 只有一个从用户获取输入的函数,input()
。相比之下,旧的 Python 2.x 有两个从用户获取输入的函数:input()
和 raw_input()
。
还有一些非常简单的方法可以读取文件,并且为了更严格地控制输入,可以从 stdin 读取,如果需要。
在 Python 3.x 中,input() 会向用户询问一串数据(以换行符结尾),并简单地返回该字符串。它也可以接受一个参数,该参数在用户输入数据之前显示为提示。例如:
print(input('What is your name?'))
打印出
What is your name? <user input data here>
示例:将用户的姓名(即字符串数据)分配给变量“x”,您将键入
x = input('What is your name?')
在旧的 Python 2.x 中,以上适用于raw_input()
函数,并且还有input()
函数,它的行为不同,它会自动评估用户输入的内容;在 Python 3 中,可以通过eval(input())
实现相同的功能。
链接
- input() 在 Python 3 的库引用中的内置函数中,docs.python.org
- raw_input() 在 Python 2 的库引用中的内置函数中,docs.python.org
在旧的 Python 2.x 中,input() 将用户输入作为字符串并对其进行评估。
因此,如果脚本写道
x = input('What are the first 10 perfect squares? ')
用户可以输入
map(lambda x: x*x, range(10))
这将产生列表形式的正确答案。请注意,任何输入的语句都不能跨越多行。
input() 不应该用于除最简单的程序之外的任何程序,出于安全原因。使用诸如以下的习语将从 raw_input() 返回的字符串转换为 Python 类型
x = None
while not x:
try:
x = int(raw_input())
except ValueError:
print('Invalid Number')
是比较好的方法,因为 input() 使用 eval() 将字面量转换为 Python 类型,这使得恶意人士可以从程序内部轻松地运行任意代码。
链接
- input() 在 Python 2 的库引用中的内置函数中,docs.python.org
要从文件读取,可以使用open 迭代文件的行
f = open('test.txt', 'r')
for line in f:
print(line[0])
f.close()
这将打印每行的第一个字符。换行符附加到以这种方式读取的每一行的末尾。open 的第二个参数可以是 'r'、'w' 或 'rw',以及其他一些参数。
读取文件的新方法,也是更好的方法
with open("test.txt", "r") as txt:
for line in txt:
print(line)
优点是打开的文件将在with 语句内的部分执行完毕后自动关闭,即使抛出异常也是如此。
由于文件在文件对象超出范围时会自动关闭,因此实际上没有必要显式关闭它们。因此,上一段代码中的循环也可以写成
for line in open('test.txt', 'r'):
print(line[0])
您可以一次读取特定数量的字符
c = f.read(1)
while len(c) > 0:
if len(c.strip()) > 0: print(c)
c = f.read(1)
这将一次读取 f 中的字符,然后在它们不是空格的情况下打印它们。
文件对象隐式包含一个标记来表示当前位置。如果文件标记应该移动回开头,则可以关闭文件对象并重新打开它,或者只需使用以下命令将标记移动回开头
f.seek(0)
有一些内置文件对象代表标准输入、输出和错误。这些对象位于 sys 模块中,分别称为 stdin、stdout 和 stderr。它们在 __stdin__、__stdout__ 和 __stderr__ 中也有不可变副本。这是为了 IDLE 和其他工具,其中标准文件已更改。
您必须导入 sys 模块才能使用特殊的 stdin、stdout、stderr I/O 处理程序。
import sys
为了更精细地控制输入,请使用 sys.stdin.read()。要实现 UNIX 'cat' 程序,您可以执行以下操作
import sys
for line in sys.stdin:
print(line, end="")
请注意,sys.stdin.read() 将从标准输入读取到 EOF。(通常是 Ctrl+D。)
传递给 Python 程序的命令行参数存储在 sys.argv 列表中。列表中的第一个项目是 Python 程序的名称,它可能包含完整的路径,也可能不包含,具体取决于调用的方式。sys.argv 列表是可修改的。
打印除程序名称本身以外的所有传递的参数
import sys
for arg in sys.argv[1:]:
print(arg)
解析传递的参数以查找传递的减号选项
import sys
option_f = False
option_p = False
option_p_argument = ""
i = 1
while i < len(sys.argv):
if sys.argv[i] == "-f":
option_f = True
sys.argv.pop(i)
elif sys.argv[i] == "-p":
option_p = True
sys.argv.pop(i)
option_p_argument = sys.argv.pop(i)
else:
i += 1
在上面,找到选项的参数被删除,以便可以循环遍历 sys.argv 以获得所有剩余的参数。
命令行参数的解析还得到库模块 optparse(已弃用)、argparse(从 Python 2.7 开始)和 getopt(为了让 C 程序员的生活更轻松)的支持。
argparse 的最小解析示例
import argparse
parser = argparse.ArgumentParser(description="Concatenates two strings")
addarg = parser.add_argument
addarg("s1", help="First string to concatenate")
addarg("s2", help="Second string to concatenate")
args = parser.parse_args()
result = args.s1 + args.s2
print(result)
使用 argparse 解析 - 指定 arg 类型为 int
import argparse
parser = argparse.ArgumentParser(description="Sum two ints")
addarg = parser.add_argument
addarg("i1", help="First int to add", type=int)
addarg("i2", help="Second int to add", type=int)
args = parser.parse_args()
result = args.i1 + args.i2
print(result)
使用 argparse 解析 - 添加可选开关 -m 以产生乘法而不是加法
import argparse
parser = argparse.ArgumentParser(description="Sums or multiplies two ints.")
addarg = parser.add_argument
addarg("i1", help="First int", type=int)
addarg("i2", help="Second int", type=int)
addarg("-m", help="Multiplies rather than adds.", action="store_true")
args = parser.parse_args()
if args.m:
result = args.i1 * args.i2
else:
result = args.i1 + args.i2
print(result)
使用 argparse 解析 - 将参数设置为消耗一个或多个项目
import argparse
parser = argparse.ArgumentParser(description="Sums one or more ints.")
addarg = parser.add_argument
addarg("intlist", help="Ints", type=int, nargs="+")
args = parser.parse_args()
result = 0
for item in args.intlist:
result += item
print(result)
用法示例:python ArgparseTest.py 1 3 5
使用 argparse 解析 - 与上面相同,但在参数描述之后添加一个帮助后记,以在 -h 之后输出
import argparse
parser = argparse.ArgumentParser(description="Sums one or more ints.",
epilog="Example: python ArgparseTest.py 1 3 5")
addarg = parser.add_argument
addarg("intlist", help="Ints", type=int, nargs="+")
args = parser.parse_args()
result = 0
for item in args.intlist:
result += item
print(result)
使用 argparse 解析 - 使第二个整数参数通过 nargs 可选
import argparse
parser = argparse.ArgumentParser(description="Sums one or two integers.",
epilog="Example: python ArgparseTest.py 3 4\n"
"Example: python ArgparseTest.py 3")
addarg = parser.add_argument
addarg("i1", help="First int", type=int)
addarg("i2", help="Second int, optional, defaulting to 1.", type=int, default=1, nargs="?")
args = parser.parse_args()
result = args.i1 + args.i2
print(result)
链接
- Python 标准库 - 28.1. sys,docs.python.org
- Python 标准库 - 15.4. argparse,docs.python.org
- Python 标准库 - 15.5. optparse,docs.python.org
- Python 标准库 - 15.6. getopt,docs.python.org
- Argparse 教程,docs.python.org
执行输出的基本方法是使用 print 语句。
print('Hello, world')
要在同一行上打印多个内容,并在它们之间用空格隔开,请在它们之间使用逗号
print('Hello,', 'World')
这将打印出以下内容
Hello, World
虽然两个字符串都不包含空格,但 print 语句由于两个对象之间的逗号而添加了一个空格。可以打印任意数据类型
print(1, 2, 0xff, 0777, 10+5j, -0.999, map, sys)
这将输出以下内容
1 2 255 511 (10+5j) -0.999 <built-in function map> <module 'sys' (built-in)>
对象可以在同一行上打印,而无需在同一行上
for i in range(10):
print(i, end=" ")
这将输出以下内容
0 1 2 3 4 5 6 7 8 9
要在打印行的末尾添加换行符,请添加一个没有对象的 print 语句。
for i in range(10):
print(i, end=" ")
print()
for i in range(10,20):
print(i, end=" ")
这将输出以下内容
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
如果没有该空 print 语句,上面的输出将如下所示
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
您可以打印到文件,而不是打印到标准输出
print('Hello, world', file=f)
这将打印到任何实现 write() 的对象,包括文件对象。
关于遗留 Python 2 的说明:在 Python 2 中,print 是一个语句而不是一个函数,不需要在它的参数周围加括号。而不是print(i, end=" "),人们会写print i,.
在 Python 3.x 中,可以通过将 end="" 传递给 print 函数或使用 write 方法来输出不带换行符的内容
import sys
print("Hello", end="")
sys.stdout.write("Hello") # Or stderr to write to standard error stream.
在 Python 2.x 中,为了避免在后续 print 语句中使用对象的输出之间添加空格和换行符,可以执行以下操作之一
串联:串联每个对象的字符串表示形式,然后将整个内容一次性打印出来。
print(str(1)+str(2)+str(0xff)+str(0777)+str(10+5j)+str(-0.999)+str(map)+str(sys))
这将输出以下内容
12255511(10+5j)-0.999<built-in function map><module 'sys' (built-in)>
写入函数:可以为sys.stdout.write创建一个简写,并将其用于输出。
import sys
write = sys.stdout.write
write('20')
write('05\n')
这将输出以下内容
2005
您可能需要使用 sys.stdout.flush() 以便快速在屏幕上显示该文本。
使用Python 3.x输出的示例
- from __future__ import print_function
- 确保 Python 2.6 及更高版本的 Python 2.x 可以使用 Python 3.x print 函数。
- print("Hello", "world")
- 打印用空格隔开的两个单词。请注意周围的括号,在 Python 2.x 中未使用。
- print("Hello world", end="")
- 不带结尾换行符打印。
- print("Hello", "world", sep="-")
- 用连字符分隔打印两个单词。
- print("Hello", 34)
- 打印各种数据类型的元素,用空格分隔它们。
- print("Hello " + 34)
- 由于尝试连接字符串和整数而引发错误。
- print("Hello " + str(34))
- 使用“+”连接字符串,在将数字转换为字符串之后。
- sum=2+2; print "The sum: %i" % sum
- 打印一个字符串,该字符串已使用作为参数传递的整数进行格式化。另请参见#格式化。
- print ("Error", file=sys.stderr)
- 输出到文件句柄,在本例中是标准错误流。
使用Python 2.x输出的示例
- print "Hello"
- print "Hello", "world"
- 用空格分隔两个单词。
- print "Hello", 34
- 打印各种数据类型的元素,用空格分隔它们。
- print "Hello " + 34
- 由于尝试连接字符串和整数而引发错误。
- print "Hello " + str(34)
- 使用“+”连接字符串,在将数字转换为字符串之后。
- print "Hello",
- 打印“Hello ”不带换行符,结尾处带空格。
- sys.stdout.write("Hello")
- 打印“Hello”不带换行符。执行“import sys”是先决条件。需要后续的“sys.stdout.flush()”才能立即在用户的屏幕上显示。
- sys.stdout.write("Hello\n")
- 打印“Hello”带换行符。
- print >> sys.stderr, "An error occurred."
- 打印到标准错误流。
- sys.stderr.write("Hello\n")
- 打印到标准错误流。
- sum=2+2; print "The sum: %i" % sum
- 打印一个字符串,该字符串已使用作为参数传递的整数进行格式化。
- formatted_string = "The sum: %i" % (2+2); print formatted_string
- 与上一个类似,只是格式化发生在 print 语句之外。
- print "Float: %6.3f" % 1.23456
- 输出“Float: 1.234”。句点后的数字 3 指定小数点后显示的小数位数,而句点前的数字 6 指定显示的数字应占用的字符总数,如果需要,将用空格填充。
- print "%s is %i years old" % ("John", 23)
- 将两个参数传递给格式化程序。
将数字从 1 到 10 打印到文件,每行一个数字
file1 = open("TestFile.txt","w")
for i in range(1,10+1):
print(i, file=file1)
file1.close()
使用“w”,文件将被打开以供写入。使用“file=file1”,print 将其输出发送到文件而不是标准输出。
将数字从 1 到 10 打印到文件,用连字符分隔
file1 = open("TestFile.txt", "w")
for i in range(1, 10+1):
if i > 1:
file1.write("-")
file1.write(str(i))
file1.close()
打开文件以进行追加而不是覆盖
file1 = open("TestFile.txt", "a")
在 Python 2.x 中,重定向到文件是通过以下方式完成的print >>file1, i.
另请参见文件章节。
使用字符串百分号运算符将数字和其他值格式化为字符串
v1 = "Int: %i" % 4 # 4
v2 = "Int zero padded: %03i" % 4 # 004
v3 = "Int space padded: %3i" % 4 # 4
v4 = "Hex: %x" % 31 # 1f
v5 = "Hex 2: %X" % 31 # 1F - capitalized F
v6 = "Oct: %o" % 8 # 10
v7 = "Float: %f" % 2.4 # 2.400000
v8 = "Float: %.2f" % 2.4 # 2.40
v9 = "Float in exp: %e" % 2.4 # 2.400000e+00
vA = "Float in exp: %E" % 2.4 # 2.400000E+00
vB = "List as string: %s" % [1, 2, 3]
vC = "Left padded str: %10s" % "cat"
vD = "Right padded str: %-10s" % "cat"
vE = "Truncated str: %.2s" % "cat"
vF = "Dict value str: %(age)s" % {"age": 20}
vG = "Char: %c" % 65 # A
vH = "Char: %c" % "A" # A
使用 format() 字符串方法将数字和其他值格式化为字符串,自 Python 2.6 起
v1 = "Arg 0: {0}".format(31) # 31
v2 = "Args 0 and 1: {0}, {1}".format(31, 65)
v3 = "Args 0 and 1: {}, {}".format(31, 65)
v4 = "Arg indexed: {0[0]}".format(["e1", "e2"])
v5 = "Arg named: {a}".format(a=31)
v6 = "Hex: {0:x}".format(31) # 1f
v7 = "Hex: {:x}".format(31) # 1f - arg 0 is implied
v8 = "Char: {0:c}".format(65) # A
v9 = "Hex: {:{h}}".format(31, h="x") # 1f - nested evaluation
使用字面字符串插值将数字和其他值格式化为字符串,自 Python 3.6 起
int1 = 31; int2 = 41; str1="aaa"; myhex = "x"
v1 = f"Two ints: {int1} {int2}"
v2 = f"Int plus 1: {int1+1}" # 32 - expression evaluation
v3 = f"Str len: {len(str1)}" # 3 - expression evaluation
v4 = f"Hex: {int1:x}" # 1f
v5 = f"Hex: {int1:{myhex}}" # 1f - nested evaluation
链接
- 5.6.2. 字符串格式化操作,docs.python.org
- 2. 内置函数 # 格式化,docs.python.org
- 7.1.2. 自定义字符串格式化,docs.python.org
- 7.1.3.1. 格式规范微语言,docs.python.org
- 7.1.4. 模板字符串,docs.python.org
- PEP 3101 -- 高级字符串格式化,python.org
- PEP 498 -- 字面字符串插值,python.org
- 7. 输入和输出 在 Python 教程中,python.org
- 6.6. print 语句 在 Python 语言参考中,python.org
- 2. 内置函数 #open 在 Python 标准库中,python.org
- 5. 内置类型 #file.write 在 Python 标准库中,python.org
- 27.1. sys — 系统特定参数和函数 在 Python 文档中,python org -- 提到了 sys.stdout 和 sys.stderr
- 2.3.8 文件对象 在 Python 库参考中,python.org,用于“flush”
- 5.6.2. 字符串格式化操作 在 Python 标准库中,python.org -- 用于“%i”、“%s”和类似的字符串格式化
- 7.2.2. 字符串格式运算符,在 Python 2.5 快速参考中,nmt.edu,用于“%i”、“%s”和类似的字符串格式化