路飞学城系列:第2章 数据类型&文件操作-练习(2)【文件操作:全局替换程序】

# coding: utf-8

"""
练习题1 —— 全局替换程序:

    写一个脚本,允许用户按以下方式执行时,即可以对指定文件内容进行全局替换
    python your_script.py old_str new_str filename

    补充知识点:
    需要使用 import sys
            sys.argv  接收到1个列表

    例如:把 “兼职白领学生空姐模特护士联系方式_Test1.txt” 文件中的 深圳 全部更改为 河南

    文本内容如下:
        乔非菲         广州    172    52    15223423525
        罗非竹         上海    175    49    18223423421
        刘非涵         上海    170    48    18223423765
        岳非妮         株洲    177    54    18225324553
        贺非萱         株洲    174    52    18223434452
        叶非萱         上海    171    49    18222432324
        刘非菲         株洲    168    50    18222432366
"""

# 实现方式1:【测试的时候发现,r和w操作,在不使用r+等混合方式的情况下,同时使用会有问题。建议open读取完成后,再去做open写入。】
"""
import sys

# 接收用户调用脚本时,外部传入的参数,是一个列表
user_input_argv = sys.argv

# 传入的老字符串
old_str = user_input_argv[1]
# 传入的新字符串
new_str = user_input_argv[2]
# 文件路径
file_path = user_input_argv[3]

# 读取文件(小的文件修改,直接加载到内存去修改即可。暂时不用 不占内存的方式 实现)
read_file = open(file=file_path, mode="r", encoding="utf-8")
# 存储文件内容
file_data = ""
# for循环文件每1行,替换字符串,并且存入file_data
for line in read_file:
    if old_str in line:
        line = line.replace(old_str, new_str)
    file_data += line
# 关闭文件操作
read_file.close()

# 写入文件
write_file = open(file=file_path, mode="w", encoding="utf-8")
# 把新的文件内容,重新写入原文件
write_file.write(file_data)
# 关闭文件操作
write_file.close()

print("修改完成!")
"""


# 实现方式2:非常简洁的写法【with open(file, "r", encoding="utf-8") as f:】,该写法会自动close
"""
import sys  # 导入sys包,用于接收外部参数

# 接收用户外部输入参数,是一个list列表
user_input_argv = sys.argv

# 老字符串
old_str = user_input_argv[1]
# 新字符串
new_str = user_input_argv[2]
# 文件路径
file_path = user_input_argv[3]
# 定义变量,存储文件内容
file_data = ""

# 读取文件
with open(file=file_path, mode="r", encoding="utf-8") as f:
    for line in f:
        if old_str in line:
            line = line.replace(old_str, new_str)
        file_data += line

# 写入(修改)文件
with open(file=file_path, mode="w", encoding="utf-8") as f:
    f.write(file_data)

print("更新完成!!!")
"""


# 实现方式3:(不占用内存,而去临时占用硬盘的方式,修改文件)
"""
import os      # 该包用于操作文件
import sys     # 该包用于接收外边参数

# 接收用户调用脚本时,外部传入的参数,是一个列表
user_input_argv = sys.argv
# 传入的老字符串
old_str = user_input_argv[1]
# 传入的新字符串
new_str = user_input_argv[2]
# 旧文件路径
old_file_path = user_input_argv[3]
# 新文件路径
new_file_path = "{0}.new.txt".format(old_file_path)

# 打开旧文件(读取)
read_old_file = open(file=old_file_path, mode="r", encoding="utf-8")
# 打开新文件(写入)
write_new_file = open(file=new_file_path, mode="w", encoding="utf-8")
# for循环文件每1行,替换字符串,并且写入新文件
for line in read_old_file:
    if old_str in line:
        line = line.replace(old_str, new_str)
    write_new_file.write(line)

# 关闭文件操作
read_old_file.close()
write_new_file.close()

# 把新文件覆盖到旧文件中
os.replace(new_file_path, old_file_path)
print("更新完成!湖南株洲是个好地方呀。")
"""
原文地址:https://www.cnblogs.com/lizhen416/p/13592303.html