python ftplib storbinary in loop写空文件

m4pnthwp  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(102)

对于一个计划的stressest,我试图写相同的文件到一个ftp服务器使用一个循环与递增的文件名.它工作正常,但仅适用于第一个文件。所有其他的都被创造出来了,但都是空的。
下面是我的代码:

from ftplib import FTP
from cred import *

# Script for streestest

ftp_conn = FTP()

ftp_conn.connect(host=hostname, port=21)

ftp_conn.login(user=username, passwd=password)

counter = 0

# Testfile must exist!

try:
    file = open(file='./testfile', mode='rb')
    for i in range(10):
        filename = f'testfile{i+1}'
        ftp_conn.storbinary(cmd=f'STOR /stresstest/{filename}', fp=file)
        print(f'wrote file: {filename}')
        counter += 1

except FileNotFoundError:
    print('File does not exist!')

ftp_conn.quit()

print(f'Written {counter} files to {ftp_conn.host}')

感谢您!

zsohkypk

zsohkypk1#

每次上传测试打开关闭文件

你需要对你的代码做两个修正:

  • 在for循环中打开文件
  • 上传到服务器FTP后(STOR命令)关闭文件testfile

正确的代码是(我已经在我的系统上测试过了):

from ftplib import FTP

# Script for streestest
ftp_conn = FTP()
ftp_conn.connect(host=hostname, port=21)
ftp_conn.login(user=username, passwd=password)

counter = 0

# Testfile must exist!
try:
    # move the open() inside the for loop
    #file = open(file='./testfile', mode='rb')  # <---- comment this instruction
    for i in range(10):
        file = open(file='./testfile', mode='rb')
        filename = f'testfile{i+1}'
        ftp_conn.storbinary(cmd=f'STOR /stresstest/{filename}', fp=file)
        print(f'wrote file: {filename}')
        counter += 1
        # close the file
        file.close()        # <----------- Add this close()

except FileNotFoundError:
    print('File does not exist!')

ftp_conn.quit()

print(f'Written {counter} files to {ftp_conn.host}')

使用上下文管理器

另一种方法是使用上下文管理器,如以下代码所示:

from ftplib import FTP

# Script for streestest
ftp_conn = FTP()
ftp_conn.connect(host=hostname, port=21)
ftp_conn.login(user=username, passwd=password)

counter = 0

# Testfile must exist!
try:
    for i in range(10):
        with open('./testfile', 'rb') as file:   # <---- here there is the context manager that opens the file
            filename = f'testfile{i+1}'
            ftp_conn.storbinary(cmd=f'STOR /stresstest/{filename}', fp=file)
            print(f'wrote file: {filename}')
            counter += 1

except FileNotFoundError:
    print('File does not exist!')

ftp_conn.quit()

print(f'Written {counter} files to {ftp_conn.host}')

由上下文管理器自动关闭文件。
这篇文章推荐使用上下文管理器,并以下面的句子开始:
强烈建议使用上下文管理器。作为一个优点,它确保文件总是关闭的,无论...

相关问题