You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python循环替换文件中MAC地址的多种表示并写回文件?

Fixing the File Write-Back Issue for MAC Address Replacement

Alright, I see the problem here—your script can correctly spot which lines need changes, but it’s not actually saving those updates back to the original file. Let’s fix that with two solid approaches: a simple in-place edit, and a more robust method that protects your file from accidental corruption.

Why Your Current Script Isn’t Saving Changes

Right now, you’re reading the file content, printing modified lines to the console, but never assembling those modified lines into new content and writing it back to the file. The r+ mode allows both read and write operations, but you need to explicitly handle overwriting the old content.

Approach 1: Simple In-Place File Edit

This method reads all lines, modifies them, then overwrites the original file. It’s great for small to medium-sized files:

import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--filename")
parser.add_argument("-m", "--mac_address")
args = parser.parse_args()
mac = args.mac_address

# Generate all possible MAC format variations to match
colon2 = mac  # 00:1a:e8:31:71:7f
dot2 = colon2.replace(":", ".")  # 00.1a.e8.31.71.7f
hyphen2 = colon2.replace(":", "-")  # 00-1a-e8-31-71-7f
nosymbol = colon2.replace(":", "")  # 001ae831717f
colon4 = ':'.join(nosymbol[i:i+4] for i in range(0, len(nosymbol), 4))  # 001a:e831:717f
dot4 = colon4.replace(":", ".")  # 001a.e831.717f
hyphen4 = colon4.replace(":", "-")  # 001a-e831-717f
replacethis = [colon2, dot2, hyphen2, dot4, colon4, nosymbol, hyphen4]

with open(args.filename, 'r+') as f:
    # Read all lines while preserving newline characters
    lines = f.readlines()
    new_lines = []
    
    for line in lines:
        # Strip newline to handle modifications cleanly
        modified_line = line.strip('\n')
        # Replace all matching MAC formats in the line
        for mac_variant in replacethis:
            if mac_variant in modified_line:
                modified_line = modified_line.replace(mac_variant, mac)
        # Add back the newline and store the modified line
        new_lines.append(f"{modified_line}\n")
    
    # Move file pointer to the start of the file
    f.seek(0)
    # Truncate the file to clear existing content
    f.truncate()
    # Write all modified lines back to the file
    f.writelines(new_lines)

print(f"Successfully updated MAC addresses in {args.filename}")

Key Improvements:

  • Uses readlines() to capture all lines with their original newline characters
  • Collects modified lines in a list to assemble the full updated content
  • Uses seek(0) and truncate() to ensure we overwrite the entire file (no leftover old content)
  • Replaces all matching MAC variants in a single line, not just the first one

Approach 2: Robust Temporary File Replacement

For larger files or critical data, this method is safer. It writes changes to a temporary file first, then replaces the original file only after the write is successful—preventing file corruption if something goes wrong mid-process:

import argparse, sys, tempfile, shutil
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--filename")
parser.add_argument("-m", "--mac_address")
args = parser.parse_args()
mac = args.mac_address

# Generate all possible MAC format variations to match
colon2 = mac  # 00:1a:e8:31:71:7f
dot2 = colon2.replace(":", ".")  # 00.1a.e8.31.71.7f
hyphen2 = colon2.replace(":", "-")  # 00-1a-e8-31-71-7f
nosymbol = colon2.replace(":", "")  # 001ae831717f
colon4 = ':'.join(nosymbol[i:i+4] for i in range(0, len(nosymbol), 4))  # 001a:e831:717f
dot4 = colon4.replace(":", ".")  # 001a.e831.717f
hyphen4 = colon4.replace(":", "-")  # 001a-e831-717f
replacethis = [colon2, dot2, hyphen2, dot4, colon4, nosymbol, hyphen4]

# Write changes to a temporary file first
with open(args.filename, 'r') as input_file, tempfile.NamedTemporaryFile('w', delete=False) as temp_file:
    temp_filename = temp_file.name
    for line in input_file:
        modified_line = line.strip('\n')
        for mac_variant in replacethis:
            if mac_variant in modified_line:
                modified_line = modified_line.replace(mac_variant, mac)
        temp_file.write(f"{modified_line}\n")

# Replace the original file with the temporary one
shutil.move(temp_filename, args.filename)
print(f"Successfully updated MAC addresses in {args.filename}")

Why This Is Better:

  • If the script crashes mid-write, your original file remains intact
  • Avoids issues with file locking or partial writes for large files

Testing with Your Sample Input

When you run either script with -m 00:1a:e8:31:71:7f and your sample file, all matching MAC variants (like 001a:e831:727f, 001ae831727f, etc.) will be replaced with your target MAC, matching your expected output exactly.

内容的提问来源于stack exchange,提问作者Baksten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:53:18