In daily programming, we often encounter the following issue: file names <span>1.jpg</span>, <span>2.jpg</span>, <span>10.jpg</span>, <span>20.jpg</span> are completely disordered in the file manager, with <span>10.jpg</span> appearing before <span>2.jpg</span>. Or when generating reports, the varying lengths of numbers lead to inconsistent output, affecting readability. Additionally, when constructing URLs for web scraping, we need to generate links in a uniform format like <span>page-001.html</span> to <span>page-999.html</span>.
These scenarios share a common requirement: padding numbers or strings with zeros to a fixed width, making them more intuitive for sorting and visually appealing when displayed. Python’s <span>str.zfill()</span> method is designed to solve these problems, allowing for quick and concise left-side zero padding.
Core Syntax Overview
<span>zfill()</span> has a very simple syntax: <span>s.zfill(width)</span>. This method takes an integer parameter <span>width</span> (target width) and returns a new string, leaving the original string unchanged. When the original string’s length is less than <span>width</span>, it pads zeros on the left until the specified width is reached; when the original string’s length is greater than or equal to <span>width</span>, it simply returns the original string.
It is important to note that <span>zfill()</span> has sign recognition capability: if the string starts with <span>+</span> or <span>-</span>, zeros will be padded after the sign rather than at the front. For example, <span>"-42".zfill(5)</span> will produce <span>"-0042"</span> instead of <span>"00-42"</span>.
<span>zfill()</span> is not limited to numeric strings; any string can use this method.
# Basic zero padding operation
print("7".zfill(3)) # Output: '007'
print("42".zfill(5)) # Output: '00042'
# Sign handling
print("-42".zfill(5)) # Output: '-0042' (zero padded after the negative sign)
print("+123".zfill(6)) # Output: '+00123' (zero padded after the positive sign)
# Non-numeric string
print("abc".zfill(5)) # Output: '00abc'
# Width not effective
print("12345".zfill(3)) # Output: '12345' (original string is longer, returned as is)
# Decimal handling (character level)
print("-3.5".zfill(6)) # Output: '-003.5' (zero padding at string level only)
# Output
007
00042
-0042
+00123
00abc
12345
-003.5
Practical Examples
Batch Renaming Image Files
Suppose you have a batch of photos exported from a camera, with file names ranging from <span>1.jpg</span> to <span>120.jpg</span>, but they are disordered in the file manager. Using <span>zfill()</span> can quickly standardize them to a three-digit format:
from pathlib import Path
# Simulate creating test files (skip this step in actual use)
test_dir = Path("photos")
test_dir.mkdir(exist_ok=True)
for i in [1, 2, 10, 15, 120]:
(test_dir / f"{i}.jpg").touch()
# Core logic for batch renaming
for file_path in test_dir.glob("*.jpg"):
# Extract the numeric part from the file name
stem_number = int(file_path.stem)
# Generate the new file name with zero padding
new_name = f"{str(stem_number).zfill(3)}.jpg"
new_path = file_path.parent / new_name
# Avoid overwriting existing files
if not new_path.exists():
file_path.rename(new_path)
print(f"Renamed: {file_path.name} -> {new_name}")
# Output
Renamed: 1.jpg -> 001.jpg
Renamed: 10.jpg -> 010.jpg
Renamed: 15.jpg -> 015.jpg
Renamed: 2.jpg -> 002.jpg
Note: In a production environment, always back up original files and check if the target file names already exist to avoid accidental overwriting. It is recommended to test in a small scope first, confirming the renaming logic is correct before performing batch operations.
Web Scraping Page URL Construction
When writing web scrapers, it is often necessary to generate a series of uniformly formatted URLs. Using <span>zfill()</span> can ensure that the page number part has a consistent length:
# Generate a list of standard formatted page URLs
base_url = "https://example.com/page-"
page_urls = [f"{base_url}{str(i).zfill(3)}.html" for i in range(1, 11)]
# View the generated results
for url in page_urls[:5]: # Display the first 5
print(url)
# Output
https://example.com/page-001.html
https://example.com/page-002.html
https://example.com/page-003.html
https://example.com/page-004.html
https://example.com/page-005.html
Log and Report Output Alignment
When outputting logs or generating reports, using <span>zfill()</span> can keep the numbering part aligned, significantly improving readability:
# Simulate logging output for task processing
tasks = [
("Download File", "Completed"),
("Data Validation", "In Progress"),
("Send Email", "Waiting"),
("Generate Report", "Completed"),
("System Backup", "Failed")
]
print("=== Task Execution Report ===")
for i, (task_name, status) in enumerate(tasks, 1):
task_id = str(i).zfill(3) # Zero pad to 3 digits
print(f"Task {task_id}: {task_name:<8} [{status}]")
# Output
=== Task Execution Report ===
Task 001: Download File [Completed]
Task 002: Data Validation [In Progress]
Task 003: Send Email [Waiting]
Task 004: Generate Report [Completed]
Task 005: System Backup [Failed]
Standardization of Numbering in Data Cleaning
During data processing, it is common to encounter situations where the lengths of numbers are inconsistent. Writing a standardization function can batch process these issues:
def normalize_id(id_string, width=6):
"""
Standardize the ID string to a fixed width
Args:
id_string: Original ID string
width: Target width, default is 6
Returns:
Standardized ID string
"""
return str(id_string).zfill(width)
# Simulate mixed-length ID data
raw_ids = ["1", "42", "789", "1234", "99999", "123456"]
# Batch standardization
standardized_ids = list(map(lambda x: normalize_id(x, 6), raw_ids))
print("Original IDs:", raw_ids)
print("Standardized:", standardized_ids)
# Application in actual data processing
import pandas as pd
# Create example DataFrame
df = pd.DataFrame({
'user_id': ['1', '42', '789', '1234'],
'username': ['alice', 'bob', 'charlie', 'david']
})
# Standardize user_id column
df['user_id_normalized'] = df['user_id'].apply(lambda x: normalize_id(x, 5))
print(df)
# Output
Original IDs: ['1', '42', '789', '1234', '99999', '123456']
Standardized: ['000001', '000042', '000789', '001234', '099999', '123456']
user_id username user_id_normalized
0 1 alice 00001
1 42 bob 00042
2 789 charlie 00789
3 1234 david 01234
Precautions
Only applies to string objects: If you have numeric data, you must first convert it to a string. Directly calling <span>zfill()</span> on a number will raise an AttributeError.
# Incorrect usage
number = 42
# print(number.zfill(5)) # AttributeError: 'int' object has no attribute 'zfill'
# Correct usage
print(str(number).zfill(5)) # Output: '00042'
Only supports left-side zero padding: <span>zfill()</span> can only add zeros on the left side; it cannot achieve right-side padding or center alignment. For other alignment methods, other techniques must be used.
Does not understand numerical semantics: <span>zfill()</span> is purely a string operation and does not comprehend the meaning of decimal points, scientific notation, etc.
print("3.14".zfill(8)) # Output: '0003.14' (not zero padding in numerical sense)
print("1e5".zfill(6)) # Output: '0001e5' (scientific notation treated as ordinary characters)
No truncation when width is insufficient: When the specified width is less than the original string length, <span>zfill()</span> will not truncate the string but return it as is.
long_string = "123456789"
print(long_string.zfill(5)) # Output: '123456789' (will not truncate to 5 digits)
Every day, we share Python programming knowledge. Feel free to follow us! If you find this helpful, please like and share!