### Python 实现带百分比的进度条
#### 第一种方法:基本进度条
在 Python 中,我们可以使用标准库 `sys` 和 `time` 来创建一个简单的带百分比的进度条。这种方法适用于需要显示某个过程进度的情况,例如数据处理、文件上传等。
```python
import sys
import time
def view_bar(num, total):
rate = num / total
rate_num = int(rate * 100)
r = '\r[%s%s]%d%%' % ("=" * rate_num, " " * (100 - rate_num), rate_num) # 使用字符串格式化来构建进度条
sys.stdout.write(r) # 将进度条输出到标准输出
sys.stdout.flush() # 立即刷新输出缓冲区,确保进度条实时更新
if __name__ == '__main__':
for i in range(0, 101): # 迭代0到100之间的整数
time.sleep(0.1) # 模拟耗时操作
view_bar(i, 100) # 更新进度条
```
#### 第二种方法:利用哈希算法生成动态效果(非进度条)
虽然这部分代码与进度条实现关系不大,但我们可以将其中的哈希算法用于某些特殊场景,如文件校验、密码加密等。这里提供了一种通过字符串生成不同长度哈希值的方法:
```python
import hashlib
a = "ateststring"
print(hashlib.md5(a.encode()).hexdigest()) # MD5哈希
print(hashlib.sha1(a.encode()).hexdigest()) # SHA-1哈希
print(hashlib.sha224(a.encode()).hexdigest()) # SHA-224哈希
print(hashlib.sha256(a.encode()).hexdigest()) # SHA-256哈希
print(hashlib.sha384(a.encode()).hexdigest()) # SHA-384哈希
print(hashlib.sha512(a.encode()).hexdigest()) # SHA-512哈希
```
#### 第三种方法:基于多线程的进度条
对于需要同时处理多个任务的情况,我们可以使用 Python 的 `threading` 库来创建并行任务,并在主进程中显示每个子任务的进度。这里提供了一个基于多线程的进度条示例:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
def productor(i):
print("thread-%d start" % i)
time.sleep(2) # 模拟耗时操作
def start():
threads = []
thread_num = 10
for x in range(thread_num):
t = threading.Thread(target=productor, args=(x,))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print('all thread end')
start()
```
在这个例子中,我们定义了 `productor` 函数来模拟每个线程的任务,并在 `start` 函数中启动这些线程。通过 `t.join()` 确保所有线程完成后再结束主进程。虽然这个示例没有直接实现进度条,但可以通过对各个线程的状态进行跟踪来展示整体进度。
#### 更复杂的进度条示例:结合SFTP传输
对于涉及文件传输的场景,可以结合 `paramiko` 库来实现在传输过程中显示进度的功能。下面的代码展示了如何使用 `paramiko` 连接到远程服务器并通过 SFTP 传输文件,并在传输过程中显示进度。
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
import sys
def progress_bar(transfer, to_be_transferred):
percent = (100.0 * transfer / to_be_transferred)
sys.stdout.write('\rProgress: %.2f%%' % percent)
sys.stdout.flush()
def main():
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='vm_135', port=22, username='root', pkey=private_key)
sftp = ssh.open_sftp()
sftp.put('local_file_path', 'remote_file_path', callback=progress_bar)
sftp.close()
ssh.close()
if __name__ == '__main__':
main()
```
在上面的例子中,我们定义了一个 `progress_bar` 函数来显示文件传输的进度。`put` 方法接受一个 `callback` 参数,当文件传输时会调用这个回调函数来更新进度条。
### 总结
通过上述几种方法,我们可以灵活地在 Python 中实现带有百分比的进度条,无论是简单的单线程应用还是复杂的多线程环境,都可以有效地提高用户体验和程序的可读性。在实际开发中,可以根据具体的业务需求选择合适的方法来实现进度条功能。