初学Python编程时,其中一个最基础、也是最重要的部分就是如何处理输入和输出。无论是简单的用户输入,还是程序输出结果,都很重要。现在,我们将一起学习Python输入输出的各种技巧和方法,让你在编写代码时得心应手。
目录
在Python中,输入Input/输出Output(简称:I/O )是指程序与外部世界之间的数据交换。掌握输入输出 (I/O) 是必不可少的。
1. Python 中的 I/O 类型
类型 | 描述 |
---|---|
标准输入输出 | 程序与键盘、显示器等标准设备之间的数据交换 |
文件 I/O | 程序与文件之间的数据交换 |
网络 I/O | 程序与网络之间的数据交换 |
2. 标准输入输出
标准输入输出是指程序与键盘、显示器等标准设备之间的数据交换。在 Python 中,可以使用 input()
函数获取用户输入,可以使用 print()
函数输出数据。标准输入输出通常使用以下三个文件对象:
类型 | 对象 | 描述 | 默认指向 |
---|---|---|---|
标准输入 | sys.stdin | 从键盘输入的数据 | 键盘 |
标准输出 | sys.stdout | 输出到显示器 | 显示器 |
标准错误输出 | sys.stderr | 输出到显示器 | 显示器 |
示例代码:获取用户输入并输出到显示器。
# 获取用户输入
name = input("请输入您的姓名:")
# 输出数据
print("欢迎使用,", name)
有上面的代码铺垫,下面我们开始逐个讲解:
2.1 标准输入
标准输入有input函数、sys.stdin模块两部分。
- input函数:
input(prompt)
函数允许你从键盘读取用户的输入。它会显示一个提示,然后等待用户输入,并返回用户输入的字符串。比如:
# 获取用户输入
name = input("请输入您的姓名:")
# 输出数据
print("欢迎使用,", name)
- sys.stdin:
sys
模块中的 stdin
对象允许你从标准输入中读取数据。你可以使用 sys.stdin.readline()
方法来读取一行输入。要使用这种方式,前提,你需要导入 sys
模块:
import sys
line = sys.stdin.readline()
print("你输入的是:", line)
2.2 标准输出
- print函数:
print()
函数是最常见的输出方式。它将字符串表示的值打印到标准输出(通常是屏幕)。你可以传递多个参数给 print()
,它们会以空格分隔,并在末尾默认添加换行符。比如,我们最初的代码“Hello, world!”:
print("Hello, world!")
# end 参数来更改末尾的字符
print("Hello", end="")
print(", world!")
- sys.stdout:
你可以直接通过 sys.stdout.write()
方法写入标准输出。这对于需要更多控制输出格式的情况很有用:
import sys
sys.stdout.write("Hello, world!\n")
3. 文件 I/O
文件 I/O 使用 open()
函数打开文件,并使用 read()
、write()
等方法进行读写操作。
操作 | 函数 | 描述 |
---|---|---|
打开文件 | open() | 打开文件 |
读文件 | read() | 读取文件内容 |
写文件 | write() | 写入文件内容 |
示例代码:将文本写入到文件。
# 打开文件
with open("my_file.txt", "w") as f:
# 写入文本
f.write("This is a test.")
上面示例代码,你可能看到了w,会有所疑惑,下面来看看这张表格,它解释了w是什么。下面的这些模式允许你以不同的方式打开文件,进行读取、写入或追加操作。
模式 | 解释 | 描述 |
---|---|---|
'r' | 读取模式(Read) | 打开文件用于读取。文件的指针将会放在文件的开头。这是默认模式。 |
'w' | 写入模式(Write) | 打开文件用于写入。如果文件存在,则覆盖文件。如果文件不存在,则创建新文件。 |
'a' | 追加模式(Append) | 打开文件用于追加内容。文件的指针将会放在文件的末尾。如果文件不存在,则创建新文件。 |
'rb' | 二进制读取模式(Read Binary) | 以二进制格式打开一个文件用于只读。文件的指针将会放在文件的开头。这个模式通常用于非文本文件,比如图像、音频等。 |
'wb' | 二进制写入模式(Write Binary) | 以二进制格式打开一个文件用于写入。如果文件存在,则覆盖文件。如果文件不存在,则创建新文件。这个模式也通常用于非文本文件的写入,比如图像、音频等。 |
'ab' | 二进制追加模式(Append Binary) | 以二进制格式打开一个文件用于追加内容。文件的指针将会放在文件的末尾。如果文件不存在,则创建新文件。这个模式也通常用于非文本文件的追加,比如图像、音频等。 |
'r+' | 读写模式(Read/Write) | 打开一个文件用于读写操作。文件的指针将会放在文件的开头。 |
'w+' | 写读模式(Write/Read) | 打开一个文件用于读写操作。如果文件存在,则覆盖文件。如果文件不存在,则创建新文件。文件的指针将会放在文件的开头。 |
'a+' | 追加读模式(Append/Read) | 打开一个文件用于读写操作。文件的指针将会放在文件的末尾。如果文件不存在,则创建新文件。 |
'rb+' | 二进制读写模式(Read/Write Binary) | 以二进制格式打开一个文件用于读写操作。文件的指针将会放在文件的开头。这个模式通常用于非文本文件的读写,比如图像、音频等。 |
'wb+' | 二进制写读模式(Write/Read Binary) | 以二进制格式打开一个文件用于读写操作。如果文件存在,则覆盖文件。如果文件不存在,则创建新文件。这个模式也通常用于非文本文件的读写,比如图像、音频等。 |
'ab+' | 二进制追加读模式(Append/Read Binary) | 以二进制格式打开一个文件用于读写操作。文件的指针将会放在文件的末尾。如果文件不存在,则创建新文件。这个模式也通常用于非文本文件的读写,比如图像、音频等。 |
根据你的需求和文件的类型,选择合适的模式非常重要,以确保文件被正确地读取或写入。
下面这张图是清晰的展示了文件的读写模式:
那么,我们通过下面的代码具体来学习一下:
3.1 文件读取
- 使用
open()
函数:
使用 open()
函数可以打开一个文件,并返回一个文件对象,你可以对这个对象进行读取操作。基本的语法如下:
# 打开文件并读取内容
with open('filename.txt', 'r') as f:
content = f.read()
print(content)
open()
函数的第一个参数是文件名,第二个参数是模式。常见的模式就是上面的表格介绍的,这里简单写几个:'r'
:只读模式'w'
:写入模式,会覆盖文件中已有的内容'a'
:追加模式,会在文件末尾添加内容'b'
:二进制模式,用于处理非文本文件
- 逐行读取
使用 readline()
方法可以逐行读取文件内容,假设我们有一个文件名为filename.txt:
with open('filename.txt', 'r') as f:
for line in f:
print(line.strip()) # strip() 用于移除行尾的换行符
3.2 文件写入
- 使用
open()
函数:
使用 open()
函数以写入模式 'w'
打开文件,可以写入内容到文件中:
# 写入内容到文件
with open('output.txt', 'w') as f:
f.write("Hello, world!\n")
f.write("This is a new line.\n")
- 使用
print()
函数:
你也可以使用 print()
函数将内容写入文件,通过指定 file
参数为打开的文件对象:
with open('output.txt', 'w') as f:
print("Hello, world!", file=f)
print("This is a new line.", file=f)
3.3 使用 with
语句
你可能也发现了,在上面的例子中,使用with
语句来打开文件。with
语句会在代码块执行完毕后自动关闭文件,这样可以确保在操作完成后正确地关闭文件并释放资源。
with open('filename.txt', 'r') as f:
content = f.read()
print(content)
# 在这里,文件已经自动关闭
3.4 异常处理
其实,很多时候,打开文件并不是那么顺利的,最好在处理文件时加上适当的异常处理(关于异常处理,后续我们会详细讲,这里只是展示给大家看,可以跳过),以应对文件不存在或无法读写等情况:
try:
with open('filename.txt', 'r') as f:
content = f.read()
print(content)
except FileNotFoundError:
print("文件不存在!")
except IOError:
print("无法读取文件!")
那么,以上是一些常用的文件输入输出的方法,具体的选择取决于你的需求。
4. 网络 I/O
网络 I/O 使用 socket
模块进行网络连接,并使用 send()
、recv()
等方法进行数据发送和接收。
操作 | 模块 | 函数 | 描述 |
网络连接 | socket | socket() | 建立网络连接 |
数据发送 | send() | 发送数据 | |
数据接收 | recv() | 接收数据 |
示例代码:创建一个简单的 HTTP 服务器 server.py,一般本机的地址都是127.0.0.1。
import socket
# 创建一个 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到本地地址和端口
s.bind(("127.0.0.1", 8310))
# 监听连接
s.listen(5)
# 接受连接
conn, addr = s.accept()
# b开头,发送数据
conn.send(b"This is Server: Hello, world!")
# 接收数据
data = conn.recv(1024)
# 在屏幕上输出收到的数据
print(data)
# 关闭连接
conn.close()
s.close()
客户端代码client.py:
import socket
# 创建一个 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器端
s.connect(("127.0.0.1", 8310))
# b开头,发送数据
s.send(b"This is Client: Hello, world!")
# 接收数据
data = s.recv(1024)
# 在屏幕上输出收到的数据
print(data)
# 关闭连接
s.close()
这时,我们将两个代码,分别保存。
然后,我们打开两个终端,第一个终端执行 server.py 文件:
$python server.py
第二个终端执行 server.py 文件:
$python client.py
# 会输出如下:
b'This is Server: Hello, world!'
回到服务器,会输出:
b‘This is Client: Hello, world!’
网络的内容还有很多,包括后期会讲的Requests库、urllib库、Asyncio库等等,这里关于网络的输入输出就简单讲这么多,后续我还会给大家详细讲讲Python的网络编程。
总结
如果大家跟着我的代码一起学习,相信你一定会有所收获。我们下一篇文章仍然会继续Python高阶特性的讲解,欢迎大家和我一起继续学习、记录python的下一个知识点。
如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!
往期学习:
VSCode安装教程(版本:1.87.0)Windows10