目录标题

  • 1. 简介
    • 1.1 Python3 输入输出的定义
    • 1.2 输入输出的重要性和常见应用场景
  • 2. 标准输入输出
    • 2.1 介绍标准输入(stdin)
    • 2.2 介绍标准输出(stdout)
    • 2.3 介绍标准错误(stderr)
    • 2.4 Python中如何处理这些流
      • 2.4.1 标准输入(stdin)
      • 2.4.2 标准输出(stdout)和标准错误(stderr)
  • 3. 输入输出的格式化 (Input/Output Formatting)
    • 3.1 格式化的概念 (Concept of Formatting)
    • 3.2 常见的格式化方法 (Common Formatting Methods)
      • 3.2.1 使用 % 操作符 (Using % Operator)
      • 3.2.2 使用 .format() 方法 (Using .format() Method)
      • 3.2.3 使用 f-string 格式化 (Using f-string Formatting)
    • 3.3 格式化的使用场景和高级用法 (Use Cases and Advanced Usage of Formatting)
      • 3.3.1 格式化数字 (Formatting Numbers)
      • 3.3.2 格式化日期和时间 (Formatting Dates and Times)
      • 3.3.3 动态格式化 (Dynamic Formatting)
  • 4. 文件读取和写入
    • 4.1 文件操作的基本概念
    • 4.2 如何在Python中打开文件
    • 4.3 如何在Python中读取文件
    • 4.4 如何在Python中写入文件
    • 4.5 使用with语句自动关闭文件
    • 4.6 文件操作的错误处理
    • 4.7 文件操作的高级主题
      • 4.7.1 文件指针操作
      • 4.7.2 二进制文件的读写
  • 5. 处理Excel文件
    • 5.1 简介xlsm格式
    • 5.2 介绍Python处理xlsm文件的库
      • 5.2.1 openpyxl 库
    • 5.3 Python中如何读取xlsm文件
    • 5.4 Python中如何写入xlsm文件
    • 5.5 高级用法:操作Excel的图表和图像
      • 5.5.1 创建和修改图表
      • 5.5.2 插入和修改图像
  • 6. 处理 Markdown 文件
    • 6.1 简介Markdown
    • 6.2 介绍Python处理Markdown文件的库
    • 6.3 Python中如何读取Markdown文件
    • 6.4 Python中如何写入Markdown文件
    • 6.5 使用Python markdown库处理Markdown文本
    • 6.6 处理Markdown文件的高级主题
      • 6.6.1 使用Python markdown库的扩展
      • 6.6.2 自定义Markdown处理
  • 7. Python在Linux环境中的输入输出
    • 7.1 使用Python和bash脚本进行交互
      • 执行shell命令
      • 获取命令的输出
      • 综合代码示例
    • 7.2 使用Python处理Linux命令的输出
      • 读取命令输出
      • 处理命令输出
      • 综合代码示例
    • 7.3 高级用法
      • 使用管道(Piping)
      • 重定向输出
      • 综合代码示例
  • 8. 结语


1. 简介

1.1 Python3 输入输出的定义

在编程世界里,输入(Input)和输出(Output)是两个基本的概念。输入是指我们向程序提供的信息或数据,而输出是指程序处理输入后给出的结果。这种处理过程是由算法(Algorithm)来实现的。

在 Python 语言中,我们称之为输入(Input)和输出(Output),或简称为 I/O 操作。

在 Python 中,输入可以来自于很多地方,比如用户的键盘输入,文件,网络等。同样,输出也可以送往很多地方,比如显示器,文件,网络等。处理这些输入输出是编程的基本任务之一。

输入(Input)通常指的是使用函数input()来接收用户的键盘输入,或者从文件或网络读取数据。例如:

user_input = input("Please enter your name: ") # 这是一个输入的例子
print("Hello, " + user_input) # 这是一个输出的例子

在上述的代码中,input()函数用来获取用户的键盘输入,而print()函数则是把字符串显示在屏幕上。

相比之下,在C或C++中,我们使用scanf()cin来接收输入,使用printf()cout来输出。与 Python 的input()print()相比,C/C++的这些函数使用起来相对复杂一些。

Python 的input()函数可以直接读取用户输入的字符串,而不需要预先声明数据类型。而在 C/C++ 中,我们需要在scanf()函数中明确指定数据类型。例如,如果我们要读取一个整数,我们需要这样写scanf("%d", &num)

Python 的print()函数也非常灵活,它可以接受任意数量的参数,并且可以输出不同类型的数据。而在 C/C++ 中,我们需要在printf()函数中使用格式化字符串,并且对于不同类型的数据,我们需要使用不同的格式化字符串。

在美式英语中,当我们在讨论这些输入输出操作时,我们通常会这样说:

  • “The input() function is used to receive user input.”(“input()函数用来接收用户输入。”)
  • “The print() function is used to display output on the screen.”(“print()函数用来在屏幕上显示输出。”)

以上的两个句子都使用了被动语态(passive voice),这在技术文档中是很常见的。被动语态使得句子的主语(the input() function 和 the print() function)成为了注意力的焦点,而句子的动词(is used)则描述了主语的行为或状态。

在 Python 的世界中,输入输出是极其重要的主题。我们在使用 Python编程时,经常需要处理各种输入和输出。因此,理解 Python 的输入输出机制,以及如何有效地使用它,是我们学习 Python 的重要部分。

1.2 输入输出的重要性和常见应用场景

输入和输出 (Input/Output,简称 I/O) 在任何编程语言中都是至关重要的。从用户与程序的交互,到程序之间的数据交换,甚至于网络通信,文件处理,数据库操作等,I/O 在其中都起着决定性的角色。理解和掌握 I/O 对于程序的开发,调试和优化都是非常重要的。

在Python中,I/O 的应用场景非常广泛,以下列举了几个主要的应用场景:

  1. 用户交互:程序通常需要与用户进行交互,例如请求用户输入(使用 input() 函数)或者向用户展示结果(使用 print() 函数)。
  2. 文件操作:程序需要读取或者写入文件。Python 提供了一系列用于文件 I/O 的内置函数,例如 open(), read(), write(), close() 等。
  3. 网络通信:在客户端/服务器模型的网络通信中,数据的输入和输出非常重要。Python 的 socket 库提供了底层的网络通信功能,包括数据的发送和接收。
  4. 数据库操作:数据库是存储和检索数据的重要工具。Python 支持多种数据库,如 MySQL, PostgreSQL, SQLite 等。与数据库的交互,包括查询和更新数据,都需要 I/O 操作。

对比 C/C++,Python 的 I/O 操作更为简洁和高效。在 C/C++ 中,进行 I/O 操作通常需要更多的代码和更复杂的错误处理。例如,读写文件时,需要手动打开和关闭文件,处理可能的错误,如文件未找到,权限不足等。而在 Python 中,使用 with 语句可以自动处理文件的打开和关闭,异常处理也更为方便。

在口语交流中,我们可以使用以下的英语句式来描述上述的应用场景:

  • “Python uses the input() function for user interaction.”(“Python 使用 input() 函数进行用户交互。”)
  • “Python provides built-in functions for file I/O operations, such as open(), read(), and write().”(“Python 提供了一系列用于文件 I/O 操作的内置函数,例如 open(), read(), write()。”)
  • “In client/server network communication, Python’s socket library is used for sending and receiving data.”(“在客户端/服务器的网络通信中,Python 的 socket 库用于数据的发送和接收。”)
  • “Python supports various databases for storing and retrieving data.”(“Python 支持多种数据库用于数据的存储和检索。”)

以上的句子都使用了主动语态(Active Voice),这使得句子的语气更为直接和有力。主动语态在英语中是非常常见的,特别是在口语交流中。

2. 标准输入输出

2.1 介绍标准输入(stdin)

在计算机科学中,标准输入(Standard Input,缩写stdin)是程序通常用来接收输入的流。这种设备通常指的是键盘输入,但也可以通过管道(pipe)或重定向(redirection)从文件或命令行获取数据。

在Python中,我们通常使用input()函数从标准输入接收数据。如下示例:

user_input = input("Please enter something: ")
print("You entered: ", user_input)

在这个例子中,input()函数读取用户在命令行中输入的任何内容,并将其作为字符串返回。之后,这个字符串会被存储在user_input变量中。

与此同时,在C/C++中,我们可以使用scanf()cin(C++)来接收标准输入。这是一个关键的差异,因为Python的input()函数始终返回一个字符串,而C/C++的scanf()cin可以根据指定的格式返回各种类型的数据。

例如,下面的C代码可以读取一个整数:

int number;
printf("Please enter a number: ");
scanf("%d", &number);
printf("You entered: %d\n", number);

这段C代码的行为与前面的Python代码类似,但它接收的是一个整数,而不是一个字符串。要在Python中完成类似的功能,我们需要使用int()函数将输入的字符串转换为整数,如下例所示:

user_input = input("Please enter a number: ")
number = int(user_input)
print("You entered: ", number)

在口语交流中,我们通常会说,“The input function in Python receives data from standard input (Python的input函数从标准输入接收数据)”,或者说,“In C, we use scanf or cin to receive data from standard input (在C中,我们使用scanfcin从标准输入接收数据)”。

在美式英语中,"receive data from"是一个常用的动词短语,用来描述从某个地方或设备获取数据的动作。“standard input"则直接翻译为"标准输入”,这是一个专业术语,用于描述程序从哪里获取输入数据。

在以下的表格中,我们可以看到Python和C/C++在处理标准输入时的一些主要差异:

语言 函数/操作符 返回类型 示例
Python input() String user_input = input("Please enter something: ")
C/C++ scanf() / cin Depends on the format specifier scanf("%d", &number); / cin >> number;

尽管Python和C/C++在处理标准输入时有些不同,但它们的目标是一样的:从用户或其他程序那里获取数据,并在自己的程序中使用这些数据。

2.2 介绍标准输出(stdout)

在计算机科学中,标准输出(Standard Output,缩写stdout)是程序通常用来发送输出的流。这种设备通常指的是显示在终端或命令行的输出,但也可以通过管道(pipe)或重定向(redirection)将输出发送到文件或其他程序。

在Python中,我们通常使用print()函数将数据写入到标准输出。如下示例:

print("Hello, world!")

这个例子中,字符串"Hello, world!"被输出到标准输出(通常是终端或命令行)。

相较于Python,C/C++使用printf()cout(C++)来发送数据到标准输出。例如:

printf("Hello, world!\n");

这段C代码与前面的Python代码功能相同,都会在标准输出打印"Hello, world!"。

在口语交流中,我们可能会说,“The print function in Python sends data to standard output (Python的print函数将数据发送到标准输出)”,或者,“In C, we use printf or cout to send data to standard output (在C中,我们使用printfcout将数据发送到标准输出)”。

"send data to"是一个常用的动词短语,用来描述发送数据到某个地方或设备的动作。“standard output"则直接翻译为"标准输出”,这是一个专业术语,用于描述程序将输出数据发送到哪里。

Python和C/C++在处理标准输出时的对比可以见下表:

语言 函数/操作符 示例
Python print() print("Hello, world!")
C/C++ printf() / cout printf("Hello, world!\n"); / cout << "Hello, world!" << endl;

标准输出对于显示程序的运行结果非常重要,它可以帮助我们理解程序的运行状态和调试程序。

2.3 介绍标准错误(stderr)

标准错误(Standard Error,缩写stderr)是程序用来输出错误信息或诊断信息的流。与标准输出不同,标准错误的信息即使在输出被重定向时,也会显示在屏幕上。这意味着我们可以将常规输出和错误信息分开。

在Python中,我们可以使用sys.stderr来写入标准错误。例如:

import sysprint("This is a regular message.")
sys.stderr.write("This is an error message.\n")

在这个例子中,"This is a regular message."将输出到标准输出,而"This is an error message."将输出到标准错误。

与此类似,在C/C++中,我们可以使用fprintf()cerr(C++)来写入标准错误。例如:

#include <stdio.h>int main() {printf("This is a regular message.\n");fprintf(stderr, "This is an error message.\n");return 0;
}

在口语交流中,我们可能会说,“In Python, we use sys.stderr.write to send data to standard error (在Python中,我们使用sys.stderr.write将数据发送到标准错误)”,或者,“In C, we use fprintf or cerr to send data to standard error (在C中,我们使用fprintfcerr将数据发送到标准错误)”。

下表总结了Python和C/C++在处理标准错误时的对比:

语言 函数/操作符 示例
Python sys.stderr.write() sys.stderr.write("This is an error message.\n")
C/C++ fprintf() / cerr fprintf(stderr, "This is an error message.\n"); / cerr << "This is an error message." << endl;

对于任何需要与用户交互,或者可能出现错误的程序来说,正确地使用标准错误都是非常重要的。

2.4 Python中如何处理这些流

Python提供了一种简单的方法来操作这些流。这些流可以通过Python的sys模块来访问。

2.4.1 标准输入(stdin)

如前所述,我们可以使用Python的input()函数从标准输入读取数据。然而,我们也可以通过sys.stdin来读取标准输入,这与input()有些许不同。

例如:

import sysfor line in sys.stdin:print("You entered: ", line)

在这个示例中,Python程序会从标准输入读取行,直到遇到EOF(End of File)标记。

2.4.2 标准输出(stdout)和标准错误(stderr)

我们可以使用sys.stdout.write()sys.stderr.write()来写入标准输出和标准错误。

例如:

import syssys.stdout.write("This is a regular message.\n")
sys.stderr.write("This is an error message.\n")

在这个示例中,我们向标准输出和标准错误写入了消息。注意,与print()不同,sys.stdout.write()sys.stderr.write()不会自动添加换行符,因此我们需要显式地添加\n

在口语交流中,我们可能会说,“In Python, we can use sys.stdin, sys.stdout, and sys.stderr to interact with the standard streams (在Python中,我们可以使用sys.stdinsys.stdoutsys.stderr来交互标准流)”。

虽然print()input()函数在大多数情况下都足够使用,但有时我们可能需要更直接地控制输入/输出流,例如在构建复杂的CLI应用,或者需要读取大量数据时。在这些情况下,了解如何使用sys.stdinsys.stdoutsys.stderr可能会很有帮助。

3. 输入输出的格式化 (Input/Output Formatting)

3.1 格式化的概念 (Concept of Formatting)

在编程语言中,格式化(Formatting)是一种调整输出以满足特定要求的方式。它涉及到如何改变变量和值的显示方式,包括数字、字符串和其他数据类型。在Python中,有许多不同的方式可以进行格式化。

格式化在Python中是非常重要的,因为它使我们能够以各种可读和可理解的格式显示数据。例如,我们可以格式化数字为货币值,显示特定的小数位数,或者在字符串中插入变量等。

对于C/C++程序员来说,Python的格式化功能可以看作是类似于printfsprintf函数,但它提供了更多的灵活性和易用性。

这里有一段Python的格式化输出的例子:

name = "Alice"
age = 25
print(f"My name is{name}and I am{age}years old.")

这段代码会输出"My name is Alice and I am 25 years old."。在这里,{name}{age}是占位符(placeholders),它们在输出的字符串中被变量的值所替代。这种方式被称为f-string格式化(f-string formatting)。

在口语交流中,你可以这样描述这个特性:

“In Python, we have a feature called ‘f-string formatting’. It allows us to embed variables inside string literals for output. This is much more convenient compared to how we do it in C or C++ with printf or sprintf functions.”

(在Python中,我们有一种叫做"f-string格式化"的特性。它允许我们在字符串字面量中嵌入变量进行输出。这比我们在C或C++中使用printfsprintf函数的方式更方便。)

根据《Fluent Python》一书的观点,Python的格式化系统的灵活性和易用性是它最吸引人的特性之一。

接下来的几个章节,我们将会详细地介绍Python中不同的格式化方法,包括它们的用法,与C/C++的对比,以及一些高级用法。我们将会通过一个带有注释的综合代码示例来进行说明。

3.2 常见的格式化方法 (Common Formatting Methods)

Python 提供了多种方式来格式化字符串,主要有以下三种:

3.2.1 使用 % 操作符 (Using % Operator)

早期的 Python 版本使用 % 操作符进行格式化,这是借鉴于 C 语言中的 printf 函数。

在下面的例子中, %s%d 是占位符,分别代表字符串(string)和整数(integer):

name = "Alice"
age = 25
print("My name is %s and I am %d years old." % (name, age))

这会输出:"My name is Alice and I am 25 years old." 在 C/C++ 中,你可能会使用类似的 printf 函数达到同样的效果。

在口语交流中,你可以这样描述 % 操作符的格式化方法:

“Python used to use the percent % sign operator for string formatting, which is similar to the printf function in C/C++.”

(Python 曾经使用百分比 % 符号操作符进行字符串格式化,这和 C/C++ 中的 printf 函数相似。)

3.2.2 使用 .format() 方法 (Using .format() Method)

Python 2.6 版本引入了 .format() 方法,它提供了更多的灵活性,比如更好地控制字段的宽度和精度,对复杂类型的支持等。

以下是一个使用 .format() 方法进行格式化的例子:

name = "Alice"
age = 25
print("My name is {} and I am {} years old.".format(name, age))

在口语交流中,你可以这样描述 .format() 方法的格式化方法:

“Python also provides a method called format() for string formatting. This method offers more flexibility than the % operator, and it can handle complex types more efficiently.”

(Python 也提供了一种叫做 format() 的方法进行字符串格式化。这种方法比 % 操作符提供更多的灵活性,并且它能更有效地处理复杂类型。)

3.2.3 使用 f-string 格式化 (Using f-string Formatting)

从 Python 3.6 版本开始,引入了 f-string 格式化,它的语法更简洁,效率更高。这种方式将变量放在字符串中,通过 {} 代替,前面加 fF

name = "Alice"
age = 25
print(f"My name is{name}and I am{age}years old.")

在口语交流中,你可以这样描述 f-string 格式化的方法:

"In Python 3.6 and later, we have f-string formatting. This feature

makes the syntax more concise and the operation more efficient. You can simply put variables in the string with curly braces {}."

(在 Python 3.6 和更高版本中,我们有 f-string 格式化。这种特性使语法更简洁,操作更高效。你可以直接将变量以大括号 {} 的形式放在字符串中。)

总的来说,Python 提供了多种方式进行格式化,每种方式都有其用途和优点。不过,f-string 格式化因其简洁性和效率在 Python 3.6 以后的版本中越来越受欢迎。

3.3 格式化的使用场景和高级用法 (Use Cases and Advanced Usage of Formatting)

格式化在编程中有许多使用场景,不仅能改变数据的显示方式,还能帮助我们更好地理解和处理数据。下面我们将介绍几个常见的使用场景和高级用法。

3.3.1 格式化数字 (Formatting Numbers)

在 Python 中,我们可以使用格式化来调整数字的显示方式。比如,我们可以将浮点数(floating-point numbers)限定为特定的小数位数,或者将数字格式化为货币形式。

下面的例子中,我们将一个浮点数限定为保留两位小数:

num = 123.456789
formatted_num = "{:.2f}".format(num)
print(formatted_num)  # 输出:123.46

我们也可以使用 f-string 进行同样的操作:

num = 123.456789
print(f"{num:.2f}")  # 输出:123.46

3.3.2 格式化日期和时间 (Formatting Dates and Times)

Python 的 datetime 库允许我们通过格式化来更改日期和时间的显示方式。我们可以使用多种方式来显示日期和时间,包括年-月-日,时-分-秒,或者是以其他格式显示。

以下是一个例子,我们将日期格式化为 ‘YYYY-MM-DD’ 的形式:

from datetime import datetimenow = datetime.now()
formatted_date = now.strftime("%Y-%m-%d")
print(formatted_date)  # 输出类似 "2023-06-21" 的日期格式

3.3.3 动态格式化 (Dynamic Formatting)

有时,我们需要根据程序运行时的情况动态地改变格式化的方式,Python 也支持这种动态格式化。我们可以在 {} 中使用星号 * 或者使用变量来动态地设置格式。

以下是一个例子,我们使用变量来动态设置小数的位数:

num = 123.456789
precision = 3
print(f"{num:.{precision}f}")  # 输出:123.457

在以上的使用场景和高级用法中,我们可以看到 Python 格式化的强大功能。无论是调整数字的显示方式,还是格式化日期和时间,甚至动态地改变格式化的方式,Python 都能很好地完成任务。

4. 文件读取和写入

在Python和C++中,我们都可以对文件进行读取和写入的操作,但方式和语法有所不同。在这一章节中,我们主要介绍Python在文件读写方面的应用,并突出Python语言特性和与C++之间的区别。

4.1 文件操作的基本概念

**文件(File)**是用来存储数据(data)的单位。在Python中,我们可以通过内建的open函数(函数名:open,开启)来打开文件,并进行读取(read)或者写入(write)的操作。

在C++中,我们也可以进行类似的操作,但需要包含头文件<fstream>,然后使用std::ifstreamstd::ofstream对象。

Python和C++在处理文件读写时的主要区别在于,Python的处理方式更加简洁,不需要显式地引入库或创建文件流对象。在Python中,打开文件后返回的是一个文件对象,我们可以通过调用这个对象的方法来进行读取或写入操作。

这是一个简单的例子,说明了如何在Python中打开一个文件:

# Python
file = open('myfile.txt', 'r')  # 打开文件用于读取,'r'表示读取模式

相应地,这是在C++中打开文件的方式:

// C++
#include <fstream>std::ifstream file("myfile.txt");  // 创建一个ifstream对象,打开文件用于读取

在这两个例子中,我们都是以读取模式(read mode)打开了一个名为’myfile.txt’的文件。在Python中,我们使用的是字符串'r'来指示读取模式,而在C++中,我们创建了一个std::ifstream对象,该对象默认在读取模式下打开文件。

请注意,无论在Python还是C++中,如果文件不存在,打开文件都会导致错误(error)。这是一种常见的运行时错误(runtime error),我们需要使用特定的错误处理机制(例如Python中的try/except语句,C++中的异常处理)来处理这类错误。

在接下来的章节中,我们会深入讲解如何在Python中读取和写入文件,以及Python和C++在这些操作中的差异。

4.2 如何在Python中打开文件

在Python中,我们使用内置的open函数来打开一个文件。open函数接收两个主要参数:第一个是文件名(包含路径,如果需要的话),第二个是模式(mode)。

模式参数主要有以下选项(以及它们的组合):

  • 'r' - 读取模式(Read mode)
  • 'w' - 写入模式(Write mode)
  • 'a' - 追加模式(Append mode)
  • 'b' - 二进制模式(Binary mode)
  • 't' - 文本模式(Text mode)
  • '+' - 读写模式(Read and write mode)

这些模式参数可以组合使用,例如 'rb' 表示以二进制格式读取文件,'w+'表示读写模式,文件不存在则创建,存在则截断后写入。

这是一些例子,显示如何在Python中打开文件:

# 打开文件用于读取
file = open('myfile.txt', 'r')# 打开文件用于写入,如果文件已存在,将被截断
file = open('myfile.txt', 'w')# 打开文件用于追加,如果文件不存在,将创建一个新文件
file = open('myfile.txt', 'a')# 以二进制格式打开文件用于读取
file = open('myfile.txt', 'rb')# 以文本格式打开文件用于读取和写入,如果文件不存在,则创建一个新文件
file = open('myfile.txt', 'w+')

对比C++,我们需要使用fstream库,并且需要明确创建对应的文件流对象(ifstream, ofstreamfstream)。同时,文件模式也有所不同,比如ios::in代表读取模式,ios::out代表写入模式,ios::app代表追加模式,ios::binary代表二进制模式。

打开文件的Python代码相比C++代码更为简洁,不需要显式包含库,且内置函数调用更直接。需要注意的是,打开文件后,一定记得在结束使用后关闭文件,防止内存泄漏或数据丢失的情况发生。在Python中,我们使用close方法来关闭文件,如file.close()。在接下来的章节,我们将更深入的了解如何在Python中进行文件读取和写入。

4.3 如何在Python中读取文件

在Python中读取文件的基本方法是使用文件对象的read方法。read方法无参数时会读取整个文件的内容,也可以接收一个整数参数来读取指定数量的字符。

以下是一些基本的示例:

file = open('myfile.txt', 'r')# 读取整个文件
data = file.read()
print(data)# 读取文件的前5个字符
file.seek(0)  # 将文件指针移到文件开头
data = file.read(5)
print(data)file.close()

注意到我们使用了seek方法将文件的读写位置(称为"文件指针")移到了文件的开头。这是因为read方法在读取文件时会移动文件指针,连续调用read方法会接着上一次的位置继续读取。

在Python中,我们也可以使用readline方法读取一行,或使用readlines方法读取所有行并返回一个列表。与此相对的,在C++中,我们通常使用getline函数来读取一行。

Python的文件读取操作相比C++更加直接和简单。Python提供了丰富的文件读取方法,使得读取整个文件、读取一行或者读取所有行都非常简单。

请注意在读取文件结束后,我们需要关闭文件,这可以通过调用文件对象的close方法实现。在接下来的章节中,我们将探讨如何在Python中写入文件。

4.4 如何在Python中写入文件

在Python中,我们使用文件对象的write方法来向文件中写入数据。这个方法接收一个字符串作为参数,并返回写入的字符数量。需要注意的是,write方法不会自动在字符串后面添加换行符,如果需要换行,我们需要在字符串的末尾添加\n

下面是一些示例,展示了如何在Python中向文件中写入数据:

file = open('myfile.txt', 'w')# 写入一些文本
file.write('Hello, world!\n')# 写入多行文本
lines = ['First line\n', 'Second line\n', 'Third line\n']
for line in lines:file.write(line)file.close()

在C++中,我们通常使用<<运算符来向文件中写入数据,这一点和Python是不同的。与Python的write方法一样,C++的<<运算符也不会自动添加换行符,如果需要换行,我们需要显式地添加\n

Python的write方法提供了一种简单直接的方式来向文件中写入数据。同样地,我们需要记得在完成写入操作后关闭文件,这可以通过调用文件对象的close方法来实现。

4.5 使用with语句自动关闭文件

在上述例子中,我们使用了close方法来关闭文件。然而,如果在读取或写入文件时发生了异常,close方法可能不会被调用,这可能导致文件资源没有被正确释放。为了解决这个问题,Python提供了with语句,可以自动地关闭文件,即使在处理文件时发生了异常。

以下是使用with语句读取和写入文件的例子:

# 读取文件
with open('myfile.txt', 'r') as file:data = file.read()print(data)# 写入文件
with open('myfile.txt', 'w') as file:file.write('Hello, world!\n')

在这些例子中,我们无需显式调用close方法,with语句会在结束时自动关闭文件。

对比C++,我们需要手动管理文件的打开和关闭。但是C++也有类似的机制,比如智能指针或者资源获取即初始化(RAII)等技术,可以帮助我们自动管理资源。

使用with语句可以使得我们的代码更加简洁,也更安全,因为我们不需要担心在何时应该关闭文件,也不需要担心因为忘记关闭文件而造成的问题。

4.6 文件操作的错误处理

在处理文件操作时,可能会遇到各种错误,比如文件不存在、没有权限或磁盘空间不足等。Python提供了异常处理机制,可以帮助我们捕获并处理这些错误。

下面是一些例子,演示了如何在Python中处理文件操作的错误:

try:# 尝试打开一个不存在的文件file = open('nofile.txt', 'r')
except FileNotFoundError:print('File not found.')try:# 尝试写入一个只读文件file = open('readonly.txt', 'w')
except PermissionError:print('No permission to write the file.')

在这些例子中,我们使用了try/except语句来捕获并处理异常。如果在try块中的代码抛出了我们在except块中指定的异常,那么except块中的代码将被执行。

对比C++,我们可以使用try/catch语句来处理异常,但是异常的类型和Python是不同的,比如C++中没有FileNotFoundErrorPermissionError这样的异常,我们需要通过检查函数的返回值或者检查错误码来判断具体的错误类型。

通过使用Python的异常处理机制,我们可以编写出更健壮的代码,能够正常处理各种可能的错误情况。在接下来的章节中,我们将探讨如何在Python中读写Excel文件。

4.7 文件操作的高级主题

在Python中,除了基础的文件读写操作,我们还有一些高级主题值得了解,比如文件指针的操作,以及二进制文件的读写。

4.7.1 文件指针操作

文件指针决定了从文件的哪个位置开始读取或者写入。使用seek函数,我们可以移动文件指针到文件的任意位置。同时,tell函数可以告诉我们文件指针当前的位置。

以下是一些示例:

with open('myfile.txt', 'r') as file:# 移动文件指针到文件开头file.seek(0)# 读取文件的前5个字符print(file.read(5))# 移动文件指针到文件的第10个字符处file.seek(10)# 从第10个字符处开始读取5个字符print(file.read(5))# 打印当前文件指针的位置print(file.tell())

4.7.2 二进制文件的读写

与文本文件不同,二进制文件包含了不可打印的字符。Python也提供了读写二进制文件的方法,只需在打开文件时使用'b'模式即可。

以下是一个示例:

# 以二进制模式写入文件
with open('myfile.bin', 'wb') as file:# 写入一个二进制字符串file.write(b'Hello, world!\n')# 以二进制模式读取文件
with open('myfile.bin', 'rb') as file:data = file.read()print(data)

请注意,二进制模式下,我们需要使用二进制字符串(前面有b前缀)。

对于C++程序员来说,文件指针的操作和二进制文件的读写都不陌生。在Python中,这些操作的语法和方法可能有所不同,但原理是相同的。这些高级主题的掌握,对于理解和使用Python进行文件操作是非常有帮助的。

5. 处理Excel文件

5.1 简介xlsm格式

Microsoft Excel 是一个广泛使用的电子表格程序,可以进行复杂的数据处理和数据分析。在Excel中,有很多不同的文件格式,其中之一就是 .xlsm(Excel Macro-Enabled Workbook,Excel启用宏的工作簿)格式。在.xlsm文件中,用户可以编写和存储VBA(Visual Basic for Applications,应用程序的视觉基础)宏。这种文件格式是二进制的,因此不能直接用文本编辑器打开。

在 Python 中,我们通常使用 openpyxl 库来处理 .xlsm 文件。openpyxl 是一个用于读取和写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件的第三方库。它内部采用了解析XML文件的方式,不需要安装 Microsoft Office 就可以直接读取和写入数据。

相比于C/C++,Python提供了更为简洁和直观的处理Excel文件的方式。在C/C++中,处理Excel文件需要借助 COM 组件或者第三方库,如 libxl,过程复杂且容易出错。然而,Python的 openpyxl 库提供了简单易用的API,大大简化了对Excel文件的操作。

# 一个简单的Python openpyxl的使用示例
from openpyxl import Workbook
wb = Workbook()# 选择活动工作表
ws = wb.active# 添加数据
ws['A1'] = 42
ws.append([1, 2, 3])# 保存为 .xlsm 文件
wb.save("sample.xlsm")

在美式英语中,描述这段代码的过程,我们会说:“First, we import the Workbook class from the openpyxl module. Then, we create a new Workbook instance. We select the active worksheet and assign the value 42 to cell A1. Next, we append a list of numbers to the worksheet. Finally, we save the workbook as a .xlsm file.” (首先,我们从 openpyxl 模块导入 Workbook 类。然后,我们创建一个新的 Workbook 实例。我们选择活动工作表并将值42赋给单元格A1。接下来,我们向工作表添加一个数字列表。最后,我们将工作簿保存为 .xlsm 文件。)

在处理xlsm文件时,我们会遇到很多特有的概念和术语。在本教程中,我会以中英文对照的方式介绍这些术语,并解释其在英语口语交流中的用法。

术语 英文 解释
工作簿 Workbook 在Excel中,一个工作簿可以包含多个工作表
工作表 Worksheet 工作簿

中的单个表格,存储和组织数据 |
| 单元格 | Cell | 工作表中的单个数据点 |

例如,“单元格"在英语中被称为"cell”。当我们在讨论Python中处理Excel文件时,我们可能会说:“We assign the value 42 to cell A1.”(我们将值42赋给A1单元格。)。

在接下来的章节中,我们将详细介绍如何在Python中读取和写入xlsm文件,以及处理xlsm文件的高级主题。

5.2 介绍Python处理xlsm文件的库

Python社区提供了许多强大的库来帮助我们处理Excel文件,比如 pandasopenpyxlxlrdxlsxwriter等。但是,针对 .xlsm 格式的文件,我们通常选择使用 openpyxl

5.2.1 openpyxl 库

openpyxl 是一个Python库,用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件。它是唯一一个可以同时处理 .xlsx.xlsm 文件的库。此外,它还提供了一些高级特性,比如操作图表和图片。

在Python中,你可以使用如下命令来安装 openpyxl

pip install openpyxl

在美式英语中,我们可以这样描述此过程:“To install the openpyxl library in Python, we use the pip command followed by ‘install openpyxl’."(要在Python中安装 openpyxl库,我们使用pip命令,后跟’install openpyxl’。)

对比C/C++,Python的库管理系统(pip)使得安装和使用第三方库变得更加简单。在C/C++中,安装和使用第三方库可能需要配置复杂的环境变量,编译源代码,链接动态或静态库等步骤。Python的 pip 则大大简化了这个过程。

在接下来的章节中,我们将详细介绍如何使用 openpyxl 来读取和写入 .xlsm 文件。

5.3 Python中如何读取xlsm文件

在Python中,我们可以使用 openpyxl 库来读取 .xlsm 文件。首先,我们需要导入 openpyxl 库,然后使用 load_workbook 函数来加载文件。接下来是一个简单的示例:

from openpyxl import load_workbook# 加载工作簿
wb = load_workbook('sample.xlsm')# 选择一个工作表
ws = wb.active# 读取某个单元格的值
print(ws['A1'].value)

在美式英语中,我们会这样描述这段代码的过程:“First, we import the load_workbook function from the openpyxl module. We use this function to load the .xlsm file. Then, we select the active worksheet. Finally, we print the value of cell A1.”(首先,我们从 openpyxl 模块导入 load_workbook 函数。我们使用这个函数来加载 .xlsm 文件。然后,我们选择活动工作表。最后,我们打印单元格A1的值。)

另外,我们还可以使用循环来读取整行或整列的数据。这是一个读取整列数据的示例:

# 读取第一列的所有数据
for cell in ws['A']:print(cell.value)

在英语中,我们会这样描述这个过程:“We use a for loop to iterate over all the cells in column A. For each cell, we print its value.”(我们使用 for 循环遍历列A中的所有单元格。对于每个单元格,我们打印它的值。)

这些代码与C/C++有着显著的区别。在C/C++中,我们需要使用 COM 组件或第三方库,并进行大量的设置才能读取Excel文件。而在Python中,我们只需要几行代码就可以轻松完成这个任务。

5.4 Python中如何写入xlsm文件

在Python中,使用openpyxl库来写入.xlsm文件非常简单直观。首先,我们需要导入必要的函数和类,然后我们可以创建一个新的工作簿,添加数据,最后保存文件。这是一个基本的示例:

from openpyxl import Workbook# 创建新的工作簿
wb = Workbook()# 选择活动的工作表
ws = wb.active# 在单元格A1写入数据
ws['A1'] = 42# 在单元格A2写入一行数据
ws.append([1, 2, 3])# 保存文件
wb.save("sample.xlsm")

在美式英语中,我们可以这样描述这段代码的过程:“First, we import the Workbook class from the openpyxl module. We create a new Workbook instance and select the active worksheet. We write the value 42 to cell A1, and a list of numbers to the next row. Finally, we save the workbook as a .xlsm file.”(首先,我们从 openpyxl 模块导入 Workbook 类。我们创建一个新的 Workbook 实例并选择活动的工作表。我们将值42写入单元格A1,并将一列数字写入下一行。最后,我们将工作簿保存为 .xlsm 文件。)

与在C/C++中写入Excel文件相比,Python提供了一种更为直观和简洁的方式。在C/C++中,你可能需要使用 COM 组件或第三方库,并涉及大量的设置和步骤。然而,在Python中,你只需要几行代码就可以轻松完成这个任务。

5.5 高级用法:操作Excel的图表和图像

除了基本的读写操作,openpyxl库还提供了一些高级功能,使我们能够操作Excel文件中的图表和图像。

5.5.1 创建和修改图表

openpyxl 支持创建新的图表和修改已有的图表。例如,我们可以创建一个柱状图来表示我们的数据。以下是一个基本的示例:

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference# 创建新的工作簿和工作表
wb = Workbook()
ws = wb.active# 添加数据到工作表
data = [[1, 2, 3, 4, 5],[6, 7, 8, 9, 10],[11, 12, 13, 14, 15]
]
for row in data:ws.append(row)# 创建一个新的柱状图
chart = BarChart()
values = Reference(ws, min_col=1, min_row=1, max_col=5, max_row=3)
chart.add_data(values)# 添加图表到工作表
ws.add_chart(chart, "E5")# 保存工作簿
wb.save("chart.xlsm")

在这个示例中,我们首先创建了一个新的工作簿和工作表,并添加了一些数据。然后,我们创建了一个新的柱状图,并将我们的数据添加到图表中。最后,我们将图表添加到工作表,并保存了工作簿。

5.5.2 插入和修改图像

openpyxl 还支持在Excel文件中插入和修改图像。这是一个插入图像的基本示例:

from openpyxl import Workbook
from openpyxl.drawing.image import Image# 创建新的工作簿和工作表
wb = Workbook()
ws = wb.active# 插入图像
img = Image('logo.png')
ws.add_image(img, 'A1')# 保存工作簿
wb.save("image.xlsm")

在这个示例中,我们首先创建了一个新的工作簿和工作表。然后,我们加载了一个图像,并将它插入到了工作表中。最后,我们保存了工作簿。

这些高级功能使得openpyxl库成为一个强大的工具,可以用来处理复杂的Excel文件。相比于C/C++,Python提供了一种更为直观和简洁的方式来操作Excel文件。

6. 处理 Markdown 文件

6.1 简介Markdown

Markdown是一种轻量级的标记语言(lightweight markup language),它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML页面。它由Aaron Swartz和John Gruber在2004年创建。

在编程和数据科学中,Markdown被广泛用于撰写说明文件、撰写技术文章,以及在网页上显示带格式的文本。与使用HTML或LaTeX等格式进行文档编写相比,Markdown的语法简单明了,可以很快地学会使用。

以下是一个Markdown语法的简单示例,其中包含了标题、列表和链接等元素:

# 这是一个标题- 这是一个列表项
- 这是另一个列表项[这是一个链接](http://www.example.com)

Markdown的特点是它的语法非常直观。例如,要创建一个标题,我们使用#符号;要创建一个列表,我们使用-符号;要创建一个链接,我们使用[]()的格式。这使得Markdown成为了一种理想的轻量级标记语言。

相比于C/C++等语言,Markdown主要用于文档编写和展示,而非程序编码。你可能在使用C/C++编程时,用到了注释(///* */)来解释你的代码,但Markdown则是一种更高级的用于编写和展示的工具。

在日常的英语交流中,你可以用以下的句式来描述Markdown:

  • “Markdown is a lightweight markup language that allows us to write documents in a readable format. This readable document can then be converted into a structured HTML page.” (Markdown是一种轻量级标记语言,它让我们能以可读的格式编写文档,然后将这些可读文档转换成结构化的HTML页面。)

这个句子的结构很清晰:主语(Markdown) + 谓语(is)+ 定语从句(that allows us…)。在这个定语从句中,"allows"是谓语,后面的"us to write documents…"是宾语。这种句型在英语中非常常见,可以用来详细描述某个主题或对象。在美式英语中,我们常常会在描述复杂的概念时使用这样的句型。

6.2 介绍Python处理Markdown文件的库

在Python中,有多个库可以用来处理Markdown文件,其中最常用的是markdown库。这个库可以将Markdown文件转换成HTML,同时也提供了扩展来支持额外的Markdown语法,例如表格和代码块。

下面是一个使用Python的markdown库将Markdown文本转换成HTML的例子:

import markdownmd_text = """
# 这是一个标题- 这是一个列表项
- 这是另一个列表项[这是一个链接](http://www.example.com)
"""html = markdown.markdown(md_text)
print(html)

运行这段代码,将会打印出对应的HTML代码。这在一些Web应用中非常有用,例如博客系统,用户可以用Markdown编写文章,然后用markdown库将其转换成HTML展示出来。

与C/C++处理文本文件的方式相比,Python的markdown库使得Markdown的处理变得简单直接。在C/C++中,我们可能需要自己写解析器来解析Markdown语法,然后再生成HTML,而Python的markdown库把这个过程简化为一行代码。这也是Python被广泛应用于处理文本数据的原因之一。

在英语中,你可以这样描述:

  • “In Python, the markdown library can be used to convert Markdown files into HTML. It simplifies the process and makes it straightforward.” (在Python中,我们可以使用markdown库将Markdown文件转换成HTML,这使得整个过程变得简单直接。)

这个句子中,“be used to”表示“被用于做某事”,这是一种描述工具或方法用途的常见句型。在这里,我们用它来描述markdown库的功能和用途。

6.3 Python中如何读取Markdown文件

读取Markdown文件在Python中是非常直接的,我们可以使用内置的文件I/O功能来实现。下面是一个基本的示例:

# 读取Markdown文件
with open('example.md', 'r') as file:md_text = file.read()print(md_text)

在这个示例中,我们使用了Python的open函数以读模式('r')打开一个名为example.md的Markdown文件,然后使用read方法读取整个文件的内容。这与C/C++中的文件读取过程非常类似,但Python的语法更加简洁。

在英语中,你可以这样描述:

  • “In Python, we can read a Markdown file using the built-in open function and the read method. This is similar to how we handle file reading in C/C++, but with a more succinct syntax.” (在Python中,我们可以使用内置的open函数和read方法来读取Markdown文件。这与我们在C/C++中处理文件读取的方式非常类似,但Python的语法更为简洁。)

在这个句子中,"how we handle file reading in C/C++“是一个定语从句,用来修饰前面的"this”,这是一种在英语中常见的用法,可以让我们的描述更加具体和清晰。

6.4 Python中如何写入Markdown文件

在Python中,我们同样可以使用内置的文件I/O功能来写入Markdown文件。下面是一个基本的示例:

md_text = """
# 这是一个标题- 这是一个列表项
- 这是另一个列表项[这是一个链接](http://www.example.com)
"""# 写入Markdown文件
with open('example.md', 'w') as file:file.write(md_text)

在这个示例中,我们首先定义了一段Markdown文本,然后使用Python的open函数以写模式('w')打开一个名为example.md的Markdown文件,并使用write方法将Markdown文本写入到文件中。如果你有C/C++的基础,你会发现这与C/C++中的文件写入过程非常相似,但Python提供了更为简洁和易读的语法。

在英语中,你可以这样描述:

  • “In Python, we can write to a Markdown file using the built-in open function and the write method. This bears similarity to how we handle file writing in C/C++, but Python offers a more succinct and readable syntax.” (在Python中,我们可以使用内置的open函数和write方法来写入Markdown文件。这与我们在C/C++中处理文件写入的方式有相似之处,但Python提供了更为简洁和易读的语法。)

在这个句子中,“bears similarity to”是一个固定短语,用来表示“与…有相似之处”,这是一种描述相似性的常见表达。

6.5 使用Python markdown库处理Markdown文本

Python的markdown库提供了将Markdown文本转换为HTML的功能,这在创建Web页面或者处理用户输入的Markdown文本时非常有用。下面是一个简单的例子:

import markdownmd_text = """
# 这是一个标题- 这是一个列表项
- 这是另一个列表项[这是一个链接](http://www.example.com)
"""html = markdown.markdown(md_text)print(html)

在这个示例中,我们首先定义了一段Markdown文本,然后使用markdown库的markdown函数将其转换为HTML。与C/C++相比,Python提供的这种将Markdown转换为HTML的方法要直接得多,因为在C/C++中,我们可能需要自己编写代码来解析Markdown语法,并将其转换为HTML。

在英语中,你可以这样描述:

  • “The Python markdown library provides a function that can convert Markdown text into HTML. This is far more direct than in C/C++, where we might have to write our own code to parse the Markdown syntax and convert it into HTML.” (Python的markdown库提供了一个函数,可以将Markdown文本转换为HTML。这比在C/C++中要直接得多,因为在C/C++中,我们可能需要自己编写代码来解析Markdown语法,并将其转换为HTML。)

在这个句子中,“where we might have to write our own code to…”是一个定语从句,用来修饰前面的"C/C++",这是一种在英语中常见的用法,可以让我们的描述更加具体和清晰。

6.6 处理Markdown文件的高级主题

6.6.1 使用Python markdown库的扩展

Python的markdown库提供了许多扩展,允许我们处理一些标准Markdown语法之外的内容。比如,tables扩展让我们能够在Markdown中创建表格,fenced_code扩展让我们能够使用GitHub风格的代码块。

以下是如何使用这些扩展的示例:

import markdownmd_text = """
# 这是一个标题//```python
print('Hello, world!')
//```| 表头1 | 表头2 |
| --- | --- |
| 行1 | 数据1 |
| 行2 | 数据2 |
"""html = markdown.markdown(md_text, extensions=['fenced_code', 'tables'])print(html)

6.6.2 自定义Markdown处理

有时,我们可能需要自定义Markdown的处理方式,例如添加新的Markdown语法,或修改现有语法的解析方式。在这种情况下,我们可以创建自己的markdown库扩展。

创建markdown库的扩展需要深入理解Markdown的解析过程和markdown库的内部工作方式,这通常需要比较高级的Python编程技能。这也是Python作为一种“胶水语言”的一个例证,它不仅可以方便地使用现有的库和工具,也可以方便地扩展和修改这些库和工具。

在英语中,你可以这样描述:

“Python’s markdown library provides a variety of extensions to handle additional Markdown syntaxes, such as tables and fenced code blocks. In addition, we can also create our own extensions to customize the Markdown processing, demonstrating the flexibility of Python as a ‘glue language’.” (Python的markdown库提供了各种扩展来处理额外的Markdown语法,例如表格和围栏代码块。此外,我们还可以创建自己的扩展来自定义Markdown处理,这展示了Python作为一种“胶水语言”的灵活性。)

在这个句子中,“demonstrating the flexibility of Python as a ‘glue language’”是一个现在分词短语,用来描述前面的动作(创建自己的扩展)。这是一种在英语中常见的用法,可以让我们的描述更加生动和具体。

7. Python在Linux环境中的输入输出

7.1 使用Python和bash脚本进行交互

在Linux环境中,Python可以与Bash shell脚本进行交互,执行shell命令,获取命令输出等。

与C/C++不同,Python提供了内置的subprocess模块,使得在Python程序中运行shell命令变得简单。在C/C++中,你可能需要使用复杂的forkexec系统调用或者使用system函数来达到同样的目的。

执行shell命令

在Python中,我们可以使用subprocess.run()函数来执行shell命令。这个函数在Python 3.5以后的版本中被引入,是执行shell命令的推荐方式。

import subprocesssubprocess.run(["ls", "-l"])

上述代码就相当于在命令行中运行ls -l。在这里,ls -l被拆分成一个列表,其中每个元素都是一个独立的命令行参数。

获取命令的输出

要获取命令的输出,我们可以给subprocess.run()添加capture_output=True参数,让它捕获输出。

import subprocessresult = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)

在这里,capture_output=True让Python捕获命令的输出,text=True让输出以文本形式返回。运行结果被保存在一个subprocess.CompletedProcess对象中,我们可以通过stdout属性来获取标准输出。

与此相对,如果你在C/C++中使用system函数,那么你就需要更复杂的操作来捕获命令的输出。例如,你可能需要重定向stdout到一个文件,然后读取这个文件。

综合代码示例

下面的示例代码展示了如何在Python中运行shell命令,获取命令的输出,并处理可能出现的错误。

import subprocess# 执行命令
try:result = subprocess.run(["ls", "-l"], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:print(f"发生错误:{e}")
else:# 处理结果lines = result.stdout.splitlines()for line in lines:print(line)

在这里,check=True表示如果命令返回非零退出状态(意味着发生了错误),Python将引发一个subprocess.CalledProcessError异常。

这个综合的示例展示了Python执行shell命令的基本流程:执行命令,获取命令的输出,处理可能出现的错误。这是Python与C/C++在执行shell命令时的一个重要区别:Python提供了简洁、易于理解的方式来处理这些操作。

7.2 使用Python处理Linux命令的输出

在Linux环境中,往往我们需要处理shell命令的输出结果。Python的subprocess模块使得获取和处理这些输出变得非常简单。

读取命令输出

如前文所述,我们可以通过设置capture_output=True参数来捕获命令的输出。这样,命令的标准输出和标准错误都可以通过stdoutstderr属性从返回的subprocess.CompletedProcess对象中获取。

import subprocessresult = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(f"标准输出(Standard Output):\n{result.stdout}")
print(f"标准错误(Standard Error):\n{result.stderr}")

处理命令输出

处理命令输出就意味着我们需要解析命令的输出。这个过程取决于你执行的特定命令和你期望得到的结果。在大多数情况下,你可能需要使用Python的字符串处理方法和正则表达式。

import subprocess# 执行df命令,查看磁盘空间使用情况
result = subprocess.run(["df", "-h"], capture_output=True, text=True)
lines = result.stdout.splitlines()# 解析输出
for line in lines:if "/dev/sda1" in line:  # 查找特定磁盘的信息parts = line.split() # 以空格分割每一部分filesystem, size, used, available, percent, mountpoint = partsprint(f"磁盘:{filesystem}, 已用:{used}, 可用:{available}")

在上述代码中,我们首先使用splitlines()方法将命令的输出分割成多行,然后在每一行中查找我们感兴趣的信息。通过这种方式,我们能够从命令的输出中提取出我们需要的数据。

综合代码示例

以下是一个综合示例,展示了如何在Python中处理命令的输出,处理可能出现的错误,以及如何从输出中解析信息。

import subprocesstry:result = subprocess.run(["df", "-h"], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:print(f"发生错误:{e}")
else:lines = result.stdout.splitlines()for line in lines:if "/dev/sda1" in line:  # 查找特定磁盘的信息parts = line.split() # 以空格分割每一部分filesystem, size, used, available, percent, mountpoint = partsprint(f"磁盘:{filesystem}, 已用:{used}, 可用:{available}")

在这个例子中,我们执行了df -h命令,然后解析其输出,找到特定磁盘的信息。这是一个在Python中处理Linux命令输出的典型例子,展示了Python的简洁性和易用性。

7.3 高级用法

对于更复杂的场景,Python的subprocess模块提供了更多的选项和功能。我们将会在这个章节介绍其中的一些高级用法。

使用管道(Piping)

在Linux中,我们经常使用管道(Pipe)将一个命令的输出作为另一个命令的输入。在Python中,我们可以通过设置subprocess.Popen对象的stdout参数,将一个命令的输出作为另一个命令的输入。

import subprocess# 创建一个Popen对象,该对象执行ls命令,其stdout被设置为一个PIPE。
p1 = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)# 创建另一个Popen对象,该对象执行grep命令,其stdin被设置为p1.stdout,即ls命令的输出。
p2 = subprocess.Popen(["grep", ".py"], stdin=p1.stdout, stdout=subprocess.PIPE)# 确保p1.stdout被关闭,以防止在p1.stdout上的挂起。
p1.stdout.close()# 读取p2的输出
output = p2.communicate()[0]

在上述代码中,我们使用了Popen对象,这是subprocess模块的核心部分,它提供了很多控制子进程的选项。

重定向输出

我们还可以重定向命令的输出到一个文件中。这可以通过设置stdout参数为一个打开的文件对象来实现。

import subprocesswith open("output.txt", "w") as f:subprocess.run(["ls", "-l"], stdout=f)

在上述代码中,ls -l的输出将被重定向到output.txt文件中。

综合代码示例

以下是一个综合示例,展示了如何在Python中使用管道和重定向输出。

import subprocess# 创建一个Popen对象,执行ls命令,其stdout被设置为一个PIPE。
p1 = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)# 创建另一个Popen对象,执行grep命令,其stdin被设置为p1.stdout,即ls命令的输出。stdout被设置为一个文件对象。
with open("output.txt", "w") as f:p2 = subprocess.Popen(["grep", ".py"], stdin=p1.stdout, stdout=f)# 确保p1.stdout被关闭,以防止在p1.stdout上的挂起。
p1.stdout.close()# 等待p2命令结束
p2.wait()

在这个例子中,我们先运行了ls -l命令,然后使用管道将其输出作为grep .py命令的输入,最后将结果重定向到一个文件中。这是Python中管道和重定向功能的一个非常实用的应用场景,它模仿了Linux环境下常见的操作。通过Python的subprocess模块,我们可以以一种非常Pythonic的方式处理这些问题。

8. 结语

在我们的编程学习之旅中,理解 Python 的输入输出 是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,掌握 Python ,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页

【Python 基础教程 20】全面掌握Python3输入输出:从入门到高级的实用指南(文件读写,Excel读写,Markdowm文件读写)相关推荐

  1. python基础教程廖雪峰云-Python3基础教程-廖雪峰[带标签完整版]

    标签: Python教程... 5 Python简介... 7 安装Python. 12 Python解释器... 16 第一个Python程序... 18 使用文本编辑器... 19 Python代 ...

  2. c++如何让字符串重复输出_如何入门Python之自学python基础教程送你参考

    随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 什么是算法 ...

  3. 莫烦Python[基础教程]

    python基础教程一 安装 定义功能 函数参数 函数默认参数 可变参数 关键字参数 变量形式 模块安装 文件读取 文件读取1 文件读取2 文件读取3 Class类 input输入 元组.列表.字典 ...

  4. python基础教程书籍-Python学习必看书籍_带你高效学习

    坚持就是胜利,祝你成功!!! 都说python是最好的语言. 1.<笨办法学Python 3> 入门强烈推荐 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴 ...

  5. python input与返回值-Python基础教程之输入输出和运算符

    在我们python中输入输出函数在程序中运用较为广泛,运算符常用于if判断的条件中,今天我来给大家讲解这两项概念. input输入和print输出 input()输入函数 从标准输入设备(一般指键盘) ...

  6. python基础教程教材-Python3零基础教材电子书合集

    Python3零基础教材电子书合集,传送门:https://www.52pojie.cn/thread-676318-1-1.html 一.<Python编程从入门到实践> 链接:http ...

  7. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  8. python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...

    Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...

  9. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

最新文章

  1. 摄像头ISP系统原理(上)
  2. python 跳过迭代_Python迭代和解析(4):自定义迭代器
  3. SCOM2016 安装OS或应用管理包
  4. 字符串的第n个排列的算法
  5. myqltransactionRollbackexception deadlock found when trying to get lock
  6. 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写
  7. Scala与Java差异(一)之基础语法
  8. yii2 ajax分页,Yii框架分页技术实例分析
  9. [Java]java反射随笔
  10. java 线程 事件_Java事件调度线程解释
  11. 60-140-046-使用-DataSink-Flink写入到MySQL的2中方式
  12. PPT转换PDF格式怎么转换?后悔现在才知道
  13. 解决12c安装过程中的各种报错
  14. python系统学习:第三周之文件操作
  15. mysql数据库接收不了中文乱码_mysql数据库 中文乱码
  16. 5G NTN进展简述
  17. 视频截取并提取成音频
  18. 中国数字油画网 数字油画软件 照片转数字油画 ai制作数字油画
  19. Motivated Word(3)
  20. Ettercap嗅探室友浏览的图片和账号密码

热门文章

  1. Ubuntu 常用快捷键、指令以及相关操作
  2. 断舍离是一种什么智慧?
  3. word-1-无法缩小行距的解决办法
  4. 普通人可以做的七个小众副业,让你告别死工资
  5. ConcurrentHashMap 锁分段技术 结构 ConcurrentLinkedQueue 阻塞队列 Fork/Join框架 工作窃取算法
  6. 【SDU青山】项目实训记录(1)
  7. 企业财务制度二--会计科目名称和编号(一)1243 库存商品(转载)
  8. cad 打开硬件加速卡_别人发来的CAD文件,对我不太友好
  9. VMware忘记账号密码的解决办法
  10. spring容器和SpringMVC容器的区别