Python学习之输入输出

当初学Python编程时,其中一个最基础、也是最重要的部分就是如何处理输入和输出。无论是简单的用户输入,还是程序输出结果,都是很重要。现在,我们将一起学习Python输入输出的各种技巧和方法,让你在编写代码时得心应手。

在Python中,输入Input/输出Output(简称:I/O )是指程序与外部世界之间的数据交换。掌握输入输出 (I/O) 是必不可少的。 

一、Python 中的 I/O 类型

类型描述
标准输入输出 程序与键盘、显示器等标准设备之间的数据交换
文件 I/O 程序与文件之间的数据交换
网络 I/O 程序与网络之间的数据交换


二、标准输入输出

标准输入输出是指程序与键盘、显示器等标准设备之间的数据交换。在 Python 中,可以使用 input() 函数获取用户输入,可以使用 print() 函数输出数据。标准输入输出通常使用以下三个文件对象:

类型对象描述默认指向
标准输入 sys.stdin 从键盘输入的数据 键盘
标准输出 sys.stdout 输出到显示器 显示器
标准错误输出 sys.stderr 输出到显示器 显示器

示例代码

获取用户输入并输出到显示器。

#🌾 获取用户输入
name = input("请输入您的姓名:")

#🌾 输出数据
print("欢迎使用,", name)

有上面的代码铺垫,下面我们开始逐个讲解:

1. 标准输入

标准输入有input函数、sys.stdin模块两部分。

🌾 input函数

input(prompt) 函数允许你从键盘读取用户的输入。它会显示一个提示,然后等待用户输入,并返回用户输入的字符串。比如:

#🌾 获取用户输入
name = input("请输入您的姓名:")

#🌾 输出数据
print("欢迎使用,", name)  

🌾 sys.stdin

sys 模块中的 stdin 对象允许你从标准输入中读取数据。你可以使用 sys.stdin.readline() 方法来读取一行输入。要使用这种方式,前提,你需要导入 sys 模块:

#🌾 引入sys模块
import sys
#🌾 调用sys模块
line = sys.stdin.readline()
print("你输入的是:", line)

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")

三、文件 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) 以二进制格式打开一个文件用于读写操作。文件的指针将会放在文件的末尾。如果文件不存在,则创建新文件。这个模式也通常用于非文本文件的读写,比如图像、音频等。

根据你的需求和文件的类型,选择合适的模式非常重要,以确保文件被正确地读取或写入。

下面这张图是清晰的展示了文件的读写模式:

 

那么,我们通过下面的代码具体来学习一下:

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() 用于移除行尾的换行符

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. 使用 with 语句

你可能也发现了,在上面的例子中,使用with 语句来打开文件。with 语句会在代码块执行完毕后自动关闭文件,这样可以确保在操作完成后正确地关闭文件并释放资源。

#🌾 使用 with 打开文集
with open('filename.txt', 'r') as f:
    content = f.read()
    print(content)
#🌾 在这里,文件已经自动关闭 

4. 异常处理

其实,很多时候,打开文件并不是那么顺利的,最好在处理文件时加上适当的异常处理(关于异常处理,后续我们会详细讲,这里只是展示给大家看,可以跳过),以应对文件不存在或无法读写等情况:

#🌾 异常处理
try:
    with open('filename.txt', 'r') as f:
        content = f.read()
        print(content)
except FileNotFoundError:
    print("文件不存在!")
except IOError:
    print("无法读取文件!") 

那么,以上是一些常用的文件输入输出的方法,具体的选择取决于你的需求。 

四、网络 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库等等,这里关于网络的输入输出就简单讲这么多。

posted on 2024-12-04 17:36  梁飞宇  阅读(1049)  评论(0)    收藏  举报