Skip to content

文件读写 说明文档

冬日新雨 edited this page Dec 26, 2022 · 7 revisions

文件读取(iter)

read_file_by_iter

使用迭代器形式读取文件内容,节省内存。文件指定为每行存储一条数据, 目的是为了避免重复编写 with open ...

文件example.txt组织形式如下

张三丰
小丽
美国
{"日本": 123}

读取至内存

>>> for line in jio.read_file_by_iter('example.txt'):
...     print(line)

  • 读取顺序从前至后,可通过 line_num(int) 指定需要的行数
  • 若文件中有 \n 空行,可以使用 skip_empty_line(bool) 来控制是否跳过
  • 每行数据包含 \r\n\t 等特殊字符,可以使用 strip(bool) 来控制是否执行 str.strip()
  • 若每行的数据是 json 格式的,可以自动执行 json.loads 进行加载。

文件读取(list)

read_file_by_line

按行读取文件内容。文件指定为每行存储一条数据, 目的是为了避免重复编写 with open ...

文件example.txt组织形式如下

张三丰
小丽
美国
{"日本": 123}

读取至内存

>>> res = jio.read_file_by_line('example.txt')
>>> print(line)

# ['张三丰', '小丽', '美国', {"日本": 123}]
  • 读取顺序从前至后,可通过 line_num(int) 指定需要的行数
  • 若文件中有 \n 空行,可以使用 skip_empty_line(bool) 来控制是否跳过
  • 每行数据包含 \r\n\t 等特殊字符,可以使用 strip(bool) 来控制是否执行 str.strip()
  • 若每行的数据是 json 格式的,可以自动执行 json.loads 进行加载。
  • 相比于 read_file_by_iter,该方法适合读取占用内存较小的数据。

文件写入

write_file_by_line

按行写入文件内容。文件指定为每行存储一条数据, 目的是为了避免重复编写 with open ...

>>> data = ['张三丰', '小丽', '美国', {"日本": 123}]
>>> jio.write_file_by_line(data, 'example.txt')

形成如下文件example.txt,组织形式为:

张三丰
小丽
美国
{"日本": 123}
  • 写入顺序从前至后,可使用 start_line_idx(int)end_line_idx(int) 控制写入指定位置的元素
  • 若数据中有 \n 空行,可以使用 replace_slash_n(bool) 来控制是转义
  • 若列表中的数据是 json 格式的,可以自动执行 json.dumps 进行加载。

计时器

TimeIt

将一段代码用 with 关键字表达的 TimeIt 工具统计代码耗时。

>>> import jionlp as jio
>>> with jio.TimeIt('stat time cost') as ti:
...     res = jio.parse_location('石河子市八子村小红旗小学', town_village=True)
...     ti.break_point(restart=True)  # 用于统计代码段中的一段断点的耗时。
...     print(res)

  • 执行后可以获取执行耗时,关键字参数依次包括 name(str) 指定代码段的功能含义,可不指定;unit(str) 计时单位,包括 秒(s)与毫秒(ms); no_print(bool) 指定是否打印计时。
  • break_point 打印代码段中截至某一部位的耗时,restart(bool) 说明是否接下来的计时从0开始。

日志处理设置函数

set_logger

设置 jionlp 的日志打印。

>>> import jionlp as jio
>>> print(jio.logging)
>>> print(jio.logging.handlers)
>>> jio.logging = jio.set_logger(level="WARN", log_dir_name=None)
>>> print(jio.logging.handlers)
>>> jio.logging.warning("这是一条自定义日志...")

  • 当执行 import jionlp as jio 后,工具包默认带入INFO级别日志,并将日志写入用户目录下的.jionlp_logs 子目录。
  • jio.set_logger 可支持调整日志方式,函数接收两个参数,level设置日志的级别,若该参数为None,则工具包全程不返回任何日志(包括屏幕日志和文件日志);否则返回屏幕日志;log_dir_name 设置写入日志的目录路径(相对或绝对路径),若该参数为None,则工具包全程不写入文件日志(仅打印屏幕前台日志)。
  • 对于非工具包内部的业务代码,可以直接使用 jio.logging 进行日志打印。

注意:

  • 有不少用户在进行多进程操作jionlp 时往往会形成多进程争用日志读写权限的问题,此时,应当将jionlp和jiojio的日志权限关闭。
# 多进程关闭写入文件日志代码样例

import jionlp as jio
import jiojio

jio.logging = jio.set_logger(level="WARN", log_dir_name=None)
jiojio.logging = jiojio.set_logger(level="WARN", log_dir_name=None)