Python读写文件

功能

由于刚好有需求要更改配置文件参数,想到python简单易用的特点,所以边学边做了这个程序帮助修改参数。该程序功能为读取一个二进制文本其中的参数按照指定格式修改。

参考教程

文件读写教程. 正则表达式教程. python的很多基础都是在廖雪峰老师这学的,写的很详细不错,所以后面的分析就不详细说了。

源码

    #!/usr/bin/python3
    # coding: utf-8
    speed = int(input("Please enter the adjustment speed: "))

    #修改test.config文件
    with open('test.config', 'r', encoding='utf-8') as o_config :
        lines = o_config.readlines()         # readlines返回每行字符串组成的list
        flen=len(lines)
        for i in range(flen):
            if lines[i].startswith("SIMULATION-TIME") :
                config_value = lines[i].split(' ')
                value = int( config_value[1][0:-2:1] )  # 用切片删去S和回车转成值         
                value = int(3600 / speed)
                lines[i] = config_value[0] + ' ' + str(value) + 'S\n'
                break
            else :
                continue
    with open('test.config','w', encoding='utf-8') as new_config :   
        new_config.writelines(lines)

    #修改test.nodes文件
    with open('test.nodes', 'r', encoding='utf-8') as o_config :
        lines = o_config.readlines()         # readlines返回每行字符串组成的list
        flen=len(lines)
        for i in range(flen):
            if lines[i] == '\n' :
                break
            node_value = lines[i].split(' ', 2)
            if node_value[1] == '0' :
                continue
            else :
                value = int( node_value[1][0: -1:1] )
                value = int( value / speed )
                lines[i] = node_value[0] + ' ' + str(value) + 'S ' + node_value[2] 
    with open('test.nodes','w', encoding='utf-8') as new_nodes :   
        new_nodes.writelines(lines)

    print("Modified to complete")

代码分析

  1. python修改文本暂时没找到直接更改办法,上述代码都是先读取文本复制到内存中的列表,修改后再将列表写入文件。
  2. 修改test.config文件代码,使用readlines返回每行字符串组成的list。当然也可以用readline和while读取每一行来进行操作。
  3. 使用startswith对每行行首判断寻找关键字符串类型,之后使用split空格分开为字符串列表后用切片提取出值对应的字符串。 例如下图中config文件会读取到lines[8]这行有待寻找关键字,用split生成list[‘SIMULATION-TIME’, ‘3600S\n’], 进行切片操作[1:-2:1]得到字符串'3600’ (回车\n也需要切片去除),这样转化成int型处理完再转为字符串填充回原来列表中即可。

config文件

  1. 之后类似的对test.nodes进行操作!
    test.nodes文件

此处,由于其配置文件规则简单由空格区分,所以处理起来只需要split和列表切片,若是复杂的字符串数据还是得用上面教程中的正则表达式来处理。 此外,如果需要更改参数精度更好的案例这里也提供一份

#!/usr/bin/python3
#coding: utf-8

#修改 1.nodes文件
speed = 100
with open('1.nodes', 'r', encoding='utf-8') as o_config :
    lines = o_config.readlines()         # readlines返回每行字符串组成的list
    flen=len(lines)
    for i in range(flen):
        if lines[i] == '\n' :
            break
        node_value = lines[i].split(' ', 5)

        valuex = round( float( node_value[2][1: -1:1]) / speed,14 )
        valuey = round( float( node_value[3][1: -1:1]) / speed,14 )
        valuez = round( float( node_value[4][1: -1:1]) / speed,14 )
        # lines[i] = node_value[0] + ' ' + node_value[1] + ' (' + \
        #     str(valuex) + ', ' + str(valuey) + ', ' + str(valuez) + ') ' + node_value[5]
        lines[i] = node_value[0] + ' ' + node_value[1] + ' (' + \
            '%.014f'%valuex + ', ' + '%.014f'%valuey + ', ' + '%.014f'%valuez + ') ' + node_value[5]
with open('1.nodes','w', encoding='utf-8') as new_nodes :   
    new_nodes.writelines(lines)

print("Modified to complete")