Useful for testing. Creates a text file.
import argparse import re from pathlib import Path import os import math def create_file_with_size(file_size_str: str, file_name: Path): """ Create a file with the specified size filled with sequential zero-padded numbers. Args: file_size_str (str): The desired size of the file, e.g., '12mb', '3gb'. file_name (Path): The path (including filename) where the file should be created. Raises: ValueError: If the size unit is not recognized or the format is invalid. """ # Define size units in bytes for to convert the unit in file_size_str to bytes size_units = {"b": 1, "kb": 1024, "mb": 1024**2, "gb": 1024**3, "ram": 0} # extract the size (float) and unit from the size string match = re.match(r"(\d+(\.\d+)?)\s*([a-zA-Z]+)", file_size_str.strip()) # error and abort if invalid if file_size_str is invalid if not match: print("Invalid size format. Please use a format like '12mb' or '3 gb'.") return # Extract the numeric value and unit from the regex match groups groups = match.groups() size = groups[0] unit = groups[-1] # there is a middle group with as well (1.5, .5, gb). Take only first and last # Finally, get to the bytes in the next few steps size = float(size) unit = unit.lower() # Convert unit to lowercase for consistency # Check if the provided unit is valid if unit not in size_units: print("Invalid size unit. Please use 'kb', 'mb', 'gb' or 'ram'.") return # Lazily calculate the size in bytes if 'ram' is specified as the unit if unit == "ram": size_units["ram"] = os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') # e.g., 4015976448 bytes # Calculate the total file size in bytes using the size and unit file_size = math.ceil(size * size_units[unit]) # Ensure the parent directory of the target file exists file_name.parent.mkdir(parents=True, exist_ok=True) current_size = 0 # Track the current size of the file being written number = 0 # Start number sequence from 0 # Open the file in write mode with open(file_name, 'w') as f: # Write numbers sequentially until the desired file size is reached while current_size < file_size: number_str = str(number).zfill(20) # Convert number to string and pad with zeros to 20 digits f.write(number_str + '\n') # Write the padded number to the file with a newline current_size += len(number_str) + 1 # Update the current size (+1 for the newline character) number += 1 # Increment the number # Reset number if it exceeds a large value (practically won't happen) if number == 10e+20: number = 0 # Print a success message indicating the file creation print(f"File '{file_name}' of size {file_size_str.strip()} created successfully.") def main(): """ Main function to parse command line arguments and create a file with the specified size. """ # Create an argument parser for command-line options parser = argparse.ArgumentParser(description="Create a file of a specified size.") # Add 'size' argument to specify the desired file size parser.add_argument("size", type=str, help="Size of the file to create (e.g., '12mb', '3 gb', or '1.3 ram' for 1.3xsize of RAM).") # Add 'destination' argument to specify the target filename parser.add_argument("destination", type=str, help="Filename of the target file") # Parse the command-line arguments args = parser.parse_args() # Call the function to create the file with the parsed size and destination create_file_with_size(args.size, Path(args.destination)) # Entry point of the script, call the main function if executed as a script if __name__ == "__main__": main()
No comments:
Post a Comment