当前位置:   article > 正文

python3 实现读写文件(xlsx文件/ini文件/json文件/yaml文件),代码已封装更新_python pandas 读取ini

python pandas 读取ini

 实现向指定的 Excel 文件中写入数据

  1. from pandas.tests.io.excel.test_xlrd import xlrd
  2. from xlutils.copy import copy
  3. from glo import BASE_DIR
  4. def write_xlsx(sheet, row, rank, data):
  5. """写入xlsx
  6. :param sheet: 获取表单sheet名称
  7. :param row: 列
  8. :param rank: 行
  9. :param data: 写入的data数据
  10. :return:
  11. """
  12. rb = xlrd.open_workbook(BASE_DIR + r'/TestData/***.xlsx') # 打开weng.xls文件
  13. wb = copy(rb) # 利用xlutils.copy下的copy函数复制
  14. ws = wb.get_sheet(sheet) # 获取表单
  15. ws.write(row, rank, data) # 改变(0,0)的值
  16. wb.save(BASE_DIR + r'/TestData/***.xlsx')
  17. # write_xlsx("自选股", 76, 7, str(data))

以上代码的作用是向指定的 Excel 文件中写入数据,其中 `xlrd` 和 `xlutils` 库用于操作 Excel 文件。

可以将该函数进行优化封装,增加一些参数的默认值,使得调用更加方便。以下是优化后的代码:

  1. import xlrd
  2. from xlutils.copy import copy
  3. def write_to_excel(file_path, sheet_name, row, col, data):
  4. """
  5. 写入excel文件
  6. :param file_path: excel文件路径
  7. :param sheet_name: 表单名称
  8. :param row: 行号
  9. :param col: 列号
  10. :param data: 写入的数据
  11. """
  12. # 打开excel文件并复制
  13. rb = xlrd.open_workbook(file_path, formatting_info=True)
  14. wb = copy(rb)
  15. # 获取表单
  16. ws = wb.get_sheet(sheet_name)
  17. # 写入数据
  18. ws.write(row, col, data)
  19. # 保存文件
  20. wb.save(file_path)

优化后的函数增加了参数的默认值,并且将函数名进行了修改,更加符合函数的作用。函数的参数说明如下:

- `file_path`: 要写入的excel文件路径
- `sheet_name`: 要写入的表单名称
- `row`: 写入数据的行号
- `col`: 写入数据的列号
- `data`: 要写入的数据

使用优化后的函数,可以通过以下方式调用: 

  1. file_path = BASE_DIR + r'/TestData/***.xlsx'
  2. sheet_name = "自选股"
  3. row = 76
  4. col = 7
  5. data = "要写入的数据"
  6. write_to_excel(file_path, sheet_name, row, col, data)

这样调用函数更加简洁明了,也可以根据实际需要修改参数。

我们还可以使用 `openpyxl` 库代替了 `xlrd` 和 `xlutils` 库,使用 `os.path` 模块拼接文件路径。 

  1. import os
  2. import openpyxl
  3. # 定义文件名和表单名
  4. file_name = "test.xlsx"
  5. sheet_name = "sheet1"
  6. # 定义数据
  7. data = "hello world"
  8. # 拼接文件路径
  9. file_path = os.path.join(BASE_DIR, "TestData", file_name)
  10. # 打开Excel文件
  11. if os.path.exists(file_path):
  12. wb = openpyxl.load_workbook(file_path)
  13. else:
  14. wb = openpyxl.Workbook()
  15. # 获取表单
  16. ws = wb[sheet_name]
  17. # 写入数据
  18. row = 1
  19. col = 1
  20. ws.cell(row=row, column=col, value=data)
  21. # 保存文件
  22. wb.save(file_path)

 优化后的代码更加简洁易读。另外,如果文件不存在,则新建一个 Excel 文件。然后对其进行二次封装:

  1. import os
  2. import openpyxl
  3. def write_to_excel(file_name, sheet_name, data):
  4. # 拼接文件路径
  5. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  6. file_path = os.path.join(BASE_DIR, "TestData", file_name)
  7. # 打开Excel文件
  8. if os.path.exists(file_path):
  9. wb = openpyxl.load_workbook(file_path)
  10. else:
  11. wb = openpyxl.Workbook()
  12. # 获取表单
  13. ws = wb[sheet_name]
  14. # 写入数据
  15. row = 1
  16. col = 1
  17. ws.cell(row=row, column=col, value=data)
  18. # 保存文件
  19. wb.save(file_path)

我们使用write_to_excel这个函数的参数包括文件名(file_name)、表单名(sheet_name)和数据(data),其中文件名和表单名需要自己定义,数据可以根据实际情况传入。在函数内部,根据文件路径打开 Excel 文件,获取表单,然后写入数据并保存文件。使用时,可以直接调用该函数,如下所示:

  1. file_name = "test.xlsx"
  2. sheet_name = "sheet1"
  3. data = "hello world"
  4. write_to_excel(file_name, sheet_name, data)

这样就可以将数据写入到指定的 Excel 文件和表单中了。

 读取xlsx文件

  1. import pandas as pd
  2. from glo import BASE_DIR
  3. def shuju(sheet):
  4. """读取xlsx文件
  5. :param sheet: 获取表单sheet名称
  6. :return:
  7. """
  8. df = pd.read_excel(BASE_DIR + r'/TestData/***.xlsx', sheet_name=sheet)
  9. # df = pd.read_excel(r'TestData/***.xlsx', sheet_name=sheet) #直接copy ***.xlsx的相对路径
  10. data = df.values
  11. # print(data)
  12. return data
  13. #def zhuorui(sheet, name, info=None):
  14. # for i in shuju(sheet):
  15. # if name in i:
  16. # if info == None:
  17. # return common(i)
  18. # else:
  19. # return common(i, info)

以上代码的功能是读取指定 Excel 文件中的指定 sheet 的数据,并返回一个包含数据的二维数组。

以下是对代码的解析和优化封装:

1. `pd.read_excel()` 函数是 Pandas 库中的读取 Excel 文件的函数,它可以直接读取 Excel 文件中的数据,参数 `sheet_name` 用于指定读取的 sheet 名称,返回的是一个 Pandas DataFrame 对象。
2. `df.values` 将 DataFrame 对象转化为 numpy 数组,该数组包含了 Excel 中的所有数据。
3. `BASE_DIR` 是一个全局变量,用于表示项目根目录的路径,`r` 表示使用原始字符串(raw string)的方式表示路径。
4. 函数名 `shuju` 不够明确,可以改为 `read_excel_data` 等更明确的名称。

开始对以上代码重新优化封装:

  1. #glo.py
  2. import os
  3. from typing import Union
  4. BASE_DIR: Union[bytes, str] = os.path.dirname(os.path.abspath(__file__))
  1. import pandas as pd
  2. from glo import BASE_DIR
  3. def read_excel_data(filename, sheet_name):
  4. """
  5. 读取指定 Excel 文件中的指定 sheet 的数据
  6. :param filename: Excel 文件名
  7. :param sheet_name: sheet 名称
  8. :return: 数据二维数组
  9. """
  10. filepath = BASE_DIR + '/TestData/' + filename
  11. data = pd.read_excel(filepath, sheet_name=sheet_name).values
  12. return data

优化后的代码中,将函数名修改为 `read_excel_data`,更明确地表达了函数的作用。将文件路径和文件名拼接的方式改为使用 `/` 进行连接,这样可以在不同的操作系统中都能正确读取文件。另外,可以将 `BASE_DIR` 变量作为参数传入,这样可以让函数更加通用。 

读写配置文件

  1. from configparser import ConfigParser
  2. def read_config(file: str):
  3. """读取配置文件
  4. :param file: 路径
  5. :return: 文件对象
  6. """
  7. rc = ConfigParser()
  8. rc.read(file, encoding="utf-8")
  9. return rc
  10. def write_config(file: str, section, option, value=None):
  11. """写配置文件
  12. :param file: 文件路径
  13. :param section: 节
  14. :param option: 选项
  15. :param value: 值
  16. :return:
  17. """
  18. rc = ConfigParser()
  19. rc.read(file, encoding="utf-8")
  20. rc.set(section, str(option), str(value))
  21. with open(file, "w", encoding="utf-8") as f:
  22. rc.write(f)

以上代码是使用 Python 的 ConfigParser 库来读取和写入配置文件的代码,主要包含两个函数:

- read_config(file): 读取指定路径的配置文件,并返回 ConfigParser 对象。
- write_config(file, section, option, value=None): 写入指定的配置项到指定的配置文件中。

优化封装的建议:

1. 将读取和写入配置文件的函数封装到一个类中,方便调用和维护。
2. 增加参数校验,如检查文件路径是否存在,检查传入的参数是否合法。
3. 增加读取和写入操作的异常处理,如文件不存在、读写出错等情况。
我们开始对以上代码的二次优化封装示例:

  1. import os
  2. from configparser import ConfigParser
  3. class ConfigHelper:
  4. """配置文件读写助手"""
  5. def __init__(self, file_path):
  6. if not os.path.exists(file_path):
  7. raise FileNotFoundError(f"{file_path} not exist.")
  8. self._config = ConfigParser()
  9. self._config.read(file_path, encoding="utf-8")
  10. def get(self, section, option):
  11. """获取指定配置项的值
  12. :param section: 节
  13. :param option: 选项
  14. :return: 值
  15. """
  16. return self._config.get(section, option)
  17. def set(self, section, option, value):
  18. """设置指定配置项的值
  19. :param section: 节
  20. :param option: 选项
  21. :param value: 值
  22. """
  23. self._config.set(section, option, value)
  24. with open(file_path, "w", encoding="utf-8") as f:
  25. self._config.write(f)

 调用示例:

  1. config_helper = ConfigHelper("config.ini")
  2. value = config_helper.get("section_name", "option_name")
  3. config_helper.set("section_name", "option_name", "new_value")

这样的话,使用 ConfigHelper 类来读取和写入配置文件就更加方便和安全了。

读写json文件 

  1. import json
  2. # 读取json数据
  3. def get_json(file: str):
  4. """读取并获取json文件
  5. :param file: 文件路径
  6. :return:
  7. """
  8. with open(file, "r", encoding="utf-8") as f:
  9. data_json = json.load(f)
  10. return data_json
  11. # jsonData = json.load(f)
  12. # data_list = list()
  13. # for data in jsonData.values():
  14. # data_list.append(data)
  15. # return data_list
  16. def write_json(file, data):
  17. """写入json文件
  18. :param file: 文件路径
  19. :param data:需要传入的数据
  20. :return:
  21. """
  22. with open(file, "w", encoding="utf-8") as f:
  23. json.dump(data, f, indent=2, ensure_ascii=False) # 写为多行

以上代码主要实现了读取和写入 JSON 文件的功能。

代码解析:

1. `get_json` 函数中,使用 `with` 语句打开文件,读取 JSON 数据,并使用 `json.load` 方法将 JSON 数据转换为 Python 对象,最后返回 Python 对象。该方法使用了类型注释,增强了代码的可读性。

2. `write_json` 函数中,使用 `with` 语句打开文件,将 Python 对象转换为 JSON 数据,并使用 `json.dump` 方法将 JSON 数据写入文件,`indent` 参数指定 JSON 数据的缩进,`ensure_ascii` 参数指定是否对非 ASCII 字符进行编码。该方法使用了类型注释,增强了代码的可读性。
对以上代码优化建议:

1. 函数名建议使用动词开头,表示该函数的功能,例如将 `get_json` 改为 `load_json`,将 `write_json` 改为 `dump_json`。

2. 可以将文件编码方式作为参数传入函数,增加函数的灵活性。

3. 可以在函数中添加异常处理,增加函数的健壮性。

我们开始对以上代码的二次优化封装:

  1. import json
  2. def load_json(file_path: str, encoding: str = "utf-8") -> dict:
  3. """加载 JSON 文件
  4. :param file_path: 文件路径
  5. :param encoding: 文件编码方式,默认为 utf-8
  6. :return: 返回 Python 对象
  7. """
  8. with open(file_path, "r", encoding=encoding) as f:
  9. data = json.load(f)
  10. return data
  11. def dump_json(file_path: str, data: dict, encoding: str = "utf-8") -> None:
  12. """将 Python 对象写入 JSON 文件
  13. :param file_path: 文件路径
  14. :param data: 需要写入的 Python 对象
  15. :param encoding: 文件编码方式,默认为 utf-8
  16. :return: None
  17. """
  18. with open(file_path, "w", encoding=encoding) as f:
  19. json.dump(data, f, indent=2, ensure_ascii=False)
  20. # 添加异常处理的代码
  21. def safe_load_json(file_path: str, encoding: str = "utf-8") -> dict:
  22. """安全加载 JSON 文件
  23. :param file_path: 文件路径
  24. :param encoding: 文件编码方式,默认为 utf-8
  25. :return: 返回 Python 对象
  26. """
  27. try:
  28. with open(file_path, "r", encoding=encoding) as f:
  29. data = json.load(f)
  30. except FileNotFoundError:
  31. print(f"{file_path} 文件不存在")
  32. data = {}
  33. except json.JSONDecodeError:
  34. print(f"{file_path} 文件格式错误")
  35. data = {}
  36. return data
  37. def safe_dump_json(file_path: str, data: dict, encoding: str = "utf-8") -> bool:
  38. """安全将 Python 对象写入 JSON 文件
  39. :param file_path: 文件路径
  40. :param data: 需要写入的 Python 对象
  41. :param encoding: 文件编码方式,默认为 utf-8
  42. :return: 返回写入是否成功
  43. """
  44. try:
  45. with open(file_path, "w", encoding=encoding) as f:
  46. json.dump(data, f, indent=2, ensure_ascii=False)
  47. return True
  48. except Exception as e:
  49. print(f"写入文件 {file_path} 失败,原因:{e}")
  50. return False

以上优化封装的代码中,我们增加了函数的健壮性和可读性,使代码更加易于维护和扩展。 

  1. import yaml
  2. from glo import BASE_DIR
  3. def yamlconfig(name):
  4. """配置一个自定义名称的yaml文件"""
  5. with open(BASE_DIR + '/TestData/' + name + '.yaml', 'rb') as f:
  6. data = yaml.load(f, Loader=yaml.FullLoader)
  7. name1 = data.get(name)
  8. return name1
  9. # print(name1)
  10. # print(yamlconfig("flag"))
  11. def write_yaml(name, data):
  12. """写入数据到一个自定义名称的yaml文件中"""
  13. with open(BASE_DIR + '/TestData/' + name + '.yaml', "w", encoding="utf-8") as f:
  14. f.write("flag: " + data)
  15. def read_yaml(name):
  16. """读取数据,从一个自定义名称的yaml文件中"""
  17. with open(BASE_DIR + r'/TestData/' + name + '.yaml', 'rb') as f:
  18. data = yaml.load(f, Loader=yaml.FullLoader)
  19. name1 = data.get('flag')
  20. return name1
  21. def yamltoken():
  22. """从token.yaml文件中获取token"""
  23. with open(BASE_DIR + r'/TestData/token.yaml', 'rb') as f:
  24. data = yaml.load(f, Loader=yaml.FullLoader)
  25. name1 = data.get('token')
  26. return name1
  27. # print(name1)
  28. # yamltoken()

以上代码主要是对 yaml 文件的读写进行封装,包括读取 yaml 文件中的配置信息和写入数据到指定的 yaml 文件中。以下是对代码进行解析并优化封装的建议:

1. 建议对函数进行注释说明,以方便其他开发人员理解代码的意图和实现方式;
2. 在读取 yaml 文件时,可以添加异常捕获,如果出现异常可以返回默认值或者抛出异常;
3. 在写入 yaml 文件时,可以将数据以字典的形式传入,这样可以更方便地对数据进行操作;
4. 在代码中,可以将 yaml 文件的路径作为参数传入,这样可以使代码更加通用。

基于以上建议,可以对代码进行如下优化和封装:

  1. import yaml
  2. def read_yaml(file_path, default_value=None):
  3. """
  4. 读取 yaml 配置文件
  5. :param file_path: 文件路径
  6. :param default_value: 默认值,当读取文件失败时返回该值,默认为 None
  7. :return: yaml 文件中的配置信息,以字典形式返回
  8. """
  9. try:
  10. with open(file_path, 'rb') as f:
  11. data = yaml.load(f, Loader=yaml.FullLoader)
  12. return data
  13. except Exception as e:
  14. print(f"读取文件 {file_path} 失败,错误信息为:{e}")
  15. return default_value
  16. def write_yaml(file_path, data):
  17. """
  18. 将数据写入 yaml 文件
  19. :param file_path: 文件路径
  20. :param data: 要写入文件的数据,以字典形式传入
  21. """
  22. try:
  23. with open(file_path, "w", encoding="utf-8") as f:
  24. yaml.dump(data, f, default_flow_style=False, allow_unicode=True)
  25. except Exception as e:
  26. print(f"写入文件 {file_path} 失败,错误信息为:{e}")

调用示例:

  1. # 读取 yaml 文件
  2. data = read_yaml("test.yaml", default_value={})
  3. print(data)
  4. # 写入 yaml 文件
  5. data = {"name": "张三", "age": 20}
  6. write_yaml("test.yaml", data)

 这样可以更加方便地读取和写入 yaml 文件,并且可以更加灵活地处理异常情况。

以下代码是glo.py,该.py文件定义了系统全路径

  1. """
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # @Time:2022/12/8 9:24
  5. # @Author:SzetoZeZe
  6. # @File:File_base.py
  7. # @Update:
  8. # @Update:系统全路径(即绝对路径)+需加上自己编写的存放文件路径地址(即相对路径)
  9. """
  10. import os
  11. from typing import Union
  12. BASE_DIR: Union[bytes, str] = os.path.dirname(os.path.abspath(__file__))

一.读取文件(获取文件)

  1. """
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # @Time:2023/1/30 16:54
  5. # @Author:SzetoZeZe
  6. # @File:read_filename.py
  7. # @Update:
  8. # @Explain:读取**文件数据内容
  9. """
  10. import logging
  11. import os
  12. import json
  13. import yaml
  14. import pandas as pd
  15. from Global.Base_setting_info.File_base import BASE_DIR
  16. # 读取json数据
  17. def get_json(file):
  18. """读取并获取json数据
  19. :param file: 存放路径
  20. :return: json数据
  21. """
  22. try:
  23. with open(file, "r", encoding="utf-8") as f:
  24. data = json.load(f)
  25. return data
  26. except NameError:
  27. raise NameError(f'读取json数据失败,文件路径信息:{file}')
  28. def get_yaml_token():
  29. """
  30. 获取token.yaml文件中的token
  31. """
  32. with open(BASE_DIR + r'/TestData/token.yaml', 'rb') as f:
  33. data = yaml.load(f, Loader=yaml.FullLoader)
  34. token_name = data.get('token')
  35. return token_name
  36. def get_custom_yaml(name):
  37. """
  38. 读取自定义名称的yaml文件
  39. """
  40. with open(BASE_DIR + r'/TestData/' + name + '.yaml', 'rb') as f:
  41. data = yaml.load(f, Loader=yaml.FullLoader)
  42. get_name = data.get('flag')
  43. return get_name
  44. def get_custom_xlsx(file_name,sheet):
  45. """
  46. 读取自定义名称的xlsx文件中的数据
  47. :param file_name: 文件名
  48. :param sheet: **.xlsx文件中的sheet页数
  49. :return:
  50. """
  51. df = pd.read_excel(BASE_DIR + rf'/TestData/{file_name}.xlsx', sheet_name=sheet)
  52. # df = pd.read_excel(r'TestData/example.xlsx', sheet_name=sheet) #直接copy example.xlsx的相对路径
  53. xlsx_data = df.values
  54. # print(data)
  55. return xlsx_data
  56. def get_txt(file: str) -> list:
  57. """读取txt文件的数据
  58. :param file: 文件路径
  59. :return: 数据列表
  60. """
  61. logging.info(f"数据文件路径:{os.path.abspath(file)}")
  62. data = []
  63. with open(file, 'r', encoding="utf-8") as f:
  64. for line in f:
  65. # 去除注释行
  66. if line[0] == '#':
  67. continue
  68. # 去除换行符
  69. if line[-1] == '\n':
  70. line = line[:-1]
  71. # 去除空行
  72. if line.strip() == "":
  73. continue
  74. data.append(line.split("|"))
  75. return data
  76. if __name__ == '__main__':
  77. L = get_txt(BASE_DIR + r"/Test_Data/stock_ts_code.txt")
  78. print(L)

以上代码主要实现了读取 json、yaml、txt、xlsx 文件中的数据。可以对其进行如下优化和封装:

1. 日志模块应该独立出来,不应该在读取数据的函数中使用。应该在调用读取数据函数时,使用 logging 模块记录日志。
2. 应该对读取数据函数进行封装,使其可以根据文件类型自动选择对应的读取方式,而不是手动指定文件类型。
3. 应该将读取数据函数放到一个单独的模块中,方便其他模块调用。

  1. import json
  2. import os
  3. import logging
  4. import yaml
  5. import pandas as pd
  6. def read_file(file_path: str):
  7. """读取数据文件
  8. :param file_path: 文件路径
  9. :return: 数据列表
  10. """
  11. file_type = os.path.splitext(file_path)[-1]
  12. if file_type == ".json":
  13. return read_json(file_path)
  14. elif file_type == ".yaml" or file_type == ".yml":
  15. return read_yaml(file_path)
  16. elif file_type == ".txt":
  17. return read_txt(file_path)
  18. elif file_type == ".xlsx" or file_type == ".xls":
  19. return read_xlsx(file_path)
  20. else:
  21. raise ValueError(f"不支持的文件类型:{file_type}")
  22. def read_json(file_path: str):
  23. """读取json文件
  24. :param file_path: 文件路径
  25. :return: json数据
  26. """
  27. try:
  28. with open(file_path, "r", encoding="utf-8") as f:
  29. data = json.load(f)
  30. return data
  31. except NameError:
  32. raise NameError(f'读取json数据失败,文件路径信息:{file_path}')
  33. def read_yaml(file_path: str):
  34. """读取yaml文件
  35. :param file_path: 文件路径
  36. :return: yaml数据
  37. """
  38. try:
  39. with open(file_path, "r", encoding="utf-8") as f:
  40. data = yaml.load(f, Loader=yaml.FullLoader)
  41. return data
  42. except NameError:
  43. raise NameError(f'读取yaml数据失败,文件路径信息:{file_path}')
  44. def read_txt(file_path: str):
  45. """读取txt文件
  46. :param file_path: 文件路径
  47. :return: 数据列表
  48. """
  49. try:
  50. with open(file_path, 'r', encoding="utf-8") as f:
  51. data = []
  52. for line in f:
  53. # 去除注释行
  54. if line[0] == '#':
  55. continue
  56. # 去除换行符
  57. if line[-1] == '\n':
  58. line = line[:-1]
  59. # 去除空行
  60. if line.strip() == "":
  61. continue
  62. data.append(line.split("|"))
  63. return data
  64. except NameError:
  65. raise NameError(f'读取txt数据失败,文件路径信息:{file_path}')
  66. def read_xlsx(file_path: str, sheet_name: str = None):
  67. """读取xlsx文件
  68. :param file_path: 文件路径
  69. :param sheet_name: sheet名字
  70. :return: 数据列表
  71. """
  72. try:
  73. df = pd.read_excel(file_path, sheet_name=sheet_name)
  74. xlsx_data = df.values
  75. return xlsx_data
  76. except NameError:
  77. raise NameError(f'读取xlsx数据失败,文件路径信息:{file_path}')
  78. if __name__ == '__main__':
  79. # 设置日志模块
  80. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  81. # 测试读取数据
  82. data = read_file("example.json")
  83. logging.info(f"读取到数据: {data}")

根据优化建议我们这样可以更方便地调用读取数据函数,并且在新增文件类型时,只需要在 `read_file` 函数中添加对应的文件类型处理即可。

二.写入某内容到文件中

  1. """
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # @Time:2023/2/8 17:04
  5. # @Author:SzetoZeZe
  6. # @File:write_filename.py
  7. # @Update:
  8. # @Explain:写入内容到文件中
  9. """
  10. import json
  11. from Global.Base_setting_info.File_base import BASE_DIR
  12. from pandas.tests.io.excel.test_xlrd import xlrd
  13. from xlutils.copy import copy
  14. def write_token_yaml(file_name, Result_content):
  15. """写入token到yaml文件中
  16. :param file_name:写入文件名字
  17. :param Result_content:结果内容
  18. :return:
  19. """
  20. try:
  21. with open(BASE_DIR + "/" + file_name + ".yaml", 'w') as file:
  22. file.write("token: " + Result_content)
  23. except ValueError:
  24. raise ValueError('写入文件内容失败/Description Failed to write the file content')
  25. def write_json(file, data):
  26. """写入json文件
  27. :param file: 文件路径
  28. :param data:需要传入的数据
  29. :return:
  30. """
  31. with open(file, "w", encoding="utf-8") as f:
  32. json.dump(data, f, indent=2, ensure_ascii=False) # 写为多行
  33. def write_yaml(name, data):
  34. """写入到自定义名称的yaml文件"""
  35. with open(BASE_DIR + '/TestData/' + name + '.yaml', "w", encoding="utf-8") as f:
  36. f.write("flag: " + data)
  37. def write_xlsx(file_name,sheet, row, rank, data):
  38. """写入xlsx
  39. :param file_name:文件名
  40. :param sheet: 获取表单sheet名称
  41. :param row: 列
  42. :param rank: 行
  43. :param data: 写入的data数据
  44. :return:
  45. """
  46. rb = xlrd.open_workbook(BASE_DIR + rf'/TestData/{file_name}.xlsx') # 打开weng.xls文件
  47. wb = copy(rb) # 利用xlutils.copy下的copy函数复制
  48. ws = wb.get_sheet(sheet) # 获取表单
  49. ws.write(row, rank, data) # 改变(0,0)的值
  50. wb.save(BASE_DIR + rf'/TestData/{file_name}.xlsx')

以上这段代码主要是实现了写入文件的操作,包括写入 token 到 yaml 文件、写入 json 文件、写入 yaml 文件和写入 xlsx 文件。代码比较简单,可以通过调用相应的 Python 库实现文件操作。

这里的优化思路主要是封装函数,提高代码的可复用性和可维护性。以下是对每个函数的优化封装:

1. `write_token_yaml()`: 函数名建议改为 `write_yaml_token()`,参数建议增加 `file_path` 参数,将文件路径作为参数传入,而不是写死在函数内部。另外,函数中的写入操作可以使用 PyYAML 库实现,这样可以更方便地写入 YAML 文件,具体实现可以参考以下代码: 

  1. import yaml
  2. def write_yaml_token(file_path, token):
  3. """将 token 写入 YAML 文件中"""
  4. with open(file_path, 'w') as f:
  5. yaml.dump({'token': token}, f)

2. `write_json()`: 函数名建议改为 `write_to_json()`,参数建议增加 `file_path` 参数,将文件路径作为参数传入,而不是写死在函数内部。另外,函数中的写入操作可以直接使用 `json.dump()` 函数实现,这样可以更简洁地写入 JSON 文件,具体实现可以参考以下代码: 

3. `write_yaml()`: 函数名建议改为 `write_to_yaml()`,参数建议增加 `file_path` 参数,将文件路径作为参数传入,而不是写死在函数内部。另外,函数中的写入操作可以使用 PyYAML 库实现,这样可以更方便地写入 YAML 文件,具体实现可以参考以下代码:

  1. import yaml
  2. def write_to_yaml(file_path, data):
  3. """将数据写入 YAML 文件中"""
  4. with open(file_path, 'w') as f:
  5. yaml.dump(data, f)

 4. `write_xlsx()`: 函数名建议改为 `write_to_xlsx()`,参数建议增加 `file_path` 参数,将文件路径作为参数传入,而不是写死在函数内部。另外,函数中的写入操作可以使用 openpyxl 库实现,这样可以更方便地写入 Excel 文件,具体实现可以参考以下代码:

  1. from openpyxl import load_workbook
  2. def write_to_xlsx(file_path, sheet_name, row, column, data):
  3. """将数据写入 Excel 文件中"""
  4. wb = load_workbook(file_path)
  5. sheet = wb[sheet_name]
  6. sheet.cell(row=row, column=column, value=data)
  7. wb.save(file_path)

通过对函数的优化封装,可以提高代码的可复用性和可维护性,方便代码的调用和维护。 

 三.创建一个自定义文件

  1. """
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # @Time:2023/2/9 9:41
  5. # @Author:SzetoZeZe
  6. # @File:create_filenname.py
  7. # @Update:
  8. # @Explain:创建一个自定义文件名
  9. """
  10. import yaml
  11. from Global.Base_setting_info.File_base import BASE_DIR
  12. def create_yaml_config(name):
  13. """
  14. 配置一个自定义名称的yaml文件
  15. """
  16. with open(BASE_DIR + '/TestData/' + name + '.yaml', 'rb') as f:
  17. data = yaml.load(f, Loader=yaml.FullLoader)
  18. create_name = data.get(name)
  19. return create_name

以上代码的作用是从指定的 YAML 文件中读取数据,并将指定名称的数据返回。

  1. import os
  2. import yaml
  3. def load_yaml_file(file_path):
  4. """
  5. 从指定路径的 YAML 文件中读取数据
  6. """
  7. with open(file_path, 'r', encoding='utf-8') as f:
  8. data = yaml.safe_load(f)
  9. return data
  10. def get_yaml_data(file_path, name):
  11. """
  12. 从指定路径的 YAML 文件中获取指定名称的数据
  13. """
  14. data = load_yaml_file(file_path)
  15. return data.get(name)
  16. def create_yaml_config(name):
  17. """
  18. 从默认路径的 YAML 文件中获取指定名称的数据
  19. """
  20. file_path = os.path.join(os.getcwd(), 'TestData', f'{name}.yaml')
  21. return get_yaml_data(file_path, name)

 这里对原有代码进行了以下优化:

1. 使用 `os.path` 而不是字符串拼接来构建文件路径,可以提高代码的可移植性;
2. 使用 `yaml.safe_load` 而不是 `yaml.load` 来加载 YAML 文件,可以提高安全性;
3. 将读取 YAML 文件的功能封装为一个函数 `load_yaml_file`,可以提高代码的复用性;
4. 将获取指定名称数据的功能封装为一个函数 `get_yaml_data`,可以提高代码的可读性;
5. 将默认路径硬编码改为使用 `os.getcwd()` 获取当前工作路径,可以提高代码的可维护性。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号