杰瑞科技汇

python ftplib cwd

Of course! The cwd() method in Python's ftplib module is a fundamental command for navigating a remote FTP server. It stands for Change Working Directory.

python ftplib cwd-图1
(图片来源网络,侵删)

Let's break down what it does, how to use it, and provide a complete, practical example.

What is ftplib.cwd()?

The cwd() method sends the CWD command to the FTP server. This command instructs the server to change the current working directory on the remote machine for your session.

Think of it like using the cd command in your local terminal (e.g., cd /var/www/html).

Key Characteristics:

python ftplib cwd-图2
(图片来源网络,侵删)
  • It's a method of an ftplib.FTP or ftplib.FTP_TLS object.
  • It does not return the new path. It only sends the command.
  • It raises an error_perm exception if the directory change fails (e.g., the directory doesn't exist or you don't have permission).

Basic Syntax

ftp.cwd(path)
  • ftp: An instance of the ftplib.FTP class.
  • path: A string representing the directory path you want to change to on the remote server. This can be an absolute path (e.g., /public_html/images) or a relative path (e.g., ../images).

Complete Example

Here is a step-by-step example demonstrating how to connect, log in, use cwd() to navigate, and then list the contents of the current directory.

import ftplib
import os
# --- Configuration ---
# Replace with your FTP server details
FTP_HOST = "ftp.dlptest.com"
FTP_USER = "dlpuser"
FTP_PASS = "rNrKYTX9g7z3RgJR"
def navigate_ftp():
    """
    Connects to an FTP server, logs in, navigates directories,
    and lists the contents of the target directory.
    """
    ftp = ftplib.FTP()
    try:
        # 1. Connect to the server
        print(f"Connecting to {FTP_HOST}...")
        ftp.connect(FTP_HOST, 2121) # Some servers use non-standard ports
        # 2. Login
        print("Logging in...")
        ftp.login(FTP_USER, FTP_PASS)
        # 3. Check the initial working directory
        # We can use pwd() to print the working directory
        print(f"Initial working directory: {ftp.pwd()}")
        # 4. Navigate to a specific directory (absolute path)
        target_dir = "/pub"
        print(f"\nChanging directory to: {target_dir}")
        ftp.cwd(target_dir)
        print(f"Current working directory is now: {ftp.pwd()}")
        # 5. List the files in the new directory
        print("\nFiles in /pub:")
        ftp.retrlines('LIST') # LIST command lists directory contents
        # 6. Navigate to a subdirectory (relative path)
        sub_dir = "doc"
        print(f"\nChanging directory to the subdirectory: {sub_dir}")
        ftp.cwd(sub_dir)
        print(f"Current working directory is now: {ftp.pwd()}")
        # 7. List files in the subdirectory
        print("\nFiles in /pub/doc:")
        ftp.retrlines('LIST')
        # 8. Go back up one directory (using '..')
        print("\nGoing back up one directory...")
        ftp.cwd('..')
        print(f"Current working directory is now: {ftp.pwd()}")
    except ftplib.all_errors as e:
        print(f"An FTP error occurred: {e}")
    finally:
        # 9. Ensure the connection is always closed
        if 'ftp' in locals() and ftp.sock is not None:
            print("\nClosing the connection.")
            ftp.quit()
if __name__ == "__main__":
    navigate_ftp()

Expected Output

Connecting to ftp.dlptest.com...
Logging in...
Initial working directory: /
Changing directory to: /pub
Current working directory is now: /pub
Files in /pub:
total 24
drwxr-xr-x   2 1002     1001         4096 Jan 01  1970 doc
-rw-r--r--   1 1002     1001          123 Jan 01  1970 readme.txt
Changing directory to the subdirectory: doc
Current working directory is now: /pub/doc
Files in /pub/doc:
total 8
-rw-r--r--   1 1002     1001          123 Jan 01  1970 welcome.msg
Going back up one directory...
Current working directory is now: /pub
Closing the connection.

Important Related Methods

You almost never use cwd() in isolation. Here are the essential companion methods:

Method Description Example
pwd() Print Working Directory. Returns the absolute path of the current directory on the server as a string. This is how you confirm cwd() worked. current_path = ftp.pwd()
dir() Lists the contents of the current directory, similar to the ls -l command. It prints the output to stdout. ftp.dir()
retrlines('LIST') A more programmatic way to list directory contents. It executes the LIST command and processes each line returned by the server, calling a function (by default, it just prints to stdout). ftp.retrlines('LIST')
quit() Closes the connection gracefully, sending a QUIT command to the server. ftp.quit()
close() Closes the connection immediately without sending a QUIT command. Use quit() for a clean exit. ftp.close()

Error Handling

If you try to cwd() into a directory that doesn't exist or you don't have permission for, ftplib will raise an error_perm exception.

import ftplib
ftp = ftplib.FTP("ftp.example.com", "user", "password")
try:
    # This will likely fail
    ftp.cwd("/non_existent_directory")
except ftplib.error_perm as e:
    print(f"Error changing directory: {e}")
    # Output will be something like:
    # Error changing directory: 550 /non_existent_directory: No such file or directory
finally:
    ftp.quit()

Common Pitfalls & Best Practices

  1. Always Close the Connection: FTP connections are a finite resource on the server. Failing to close them can lead to your IP being temporarily blocked. Use a try...finally block to ensure ftp.quit() is always called.
  2. Use pwd() to Verify: After a cwd() call, immediately call ftp.pwd() to confirm you are where you expect to be. This is a great debugging step.
  3. Handle Exceptions: Network connections and file systems are unreliable. Always wrap your FTP logic in a try...except ftplib.all_errors block to catch potential issues like connection drops, authentication failures, or permission errors.
  4. Prefer FTP_TLS for Security: If the server supports it, use ftplib.FTP_TLS() to establish a secure connection. It encrypts both commands and data, preventing your username and password from being sent in plaintext.
# Example of a secure connection
ftp_tls = ftplib.FTP_TLS()
ftp_tls.connect("ftp.secure-server.com")
ftp_tls.login("user", "password")
# The data connection is now secured. You can proceed with cwd(), etc.
ftp_tls.cwd("/secure_folder")
分享:
扫描分享到社交APP
上一篇
下一篇