Skip to main content

Easy use for fetch data from kinds of files

Project description

filez

易用的小型数据及配置文件解析库。

Languate - Python PyPI - License PyPI PyPI - Downloads

特性

  • 支持加载 INI /JSON / YAML / TOML / CSV / EXCEL / XML / HTML / CVF / XMIND / TXT 等文件数据
  • 支持自动转换值类型,支持转换 datetime 类型,支持自动解析 环境变量

安装方法

pip install filez

使用方法

from filez import file

data = file.load_ini('testdata/data.ini') # 根据文件后缀自动识别类型
print(data)

加载 INI 文件

默认文件后缀名支持 .ini /.conf / .config,如果是其他后缀名,可以使用 file.load_ini('xxx.xxx') 进行加载

特性:

  • 支持空值
  • 大小写敏感
  • 支持${ENV_KEY}引用环境变量,支持环境变量默认值,支持字符串中部分插入环境变量
  • 支持自动识别变量类型,
    • 支持int, float自动转换
    • 支持true/TRUE/True/on转为True, 支持false/FALSE/False/off转为False
    • 支持null/None/~转为None
    • 支持{k:v} / [a,b] 自动转为dict和list (支持yaml格式,key,value不加引号)
  • 支持%(option)s,引用当前section的某个值

例如: 数据文件: testdata/data.conf

[DEFAULT]
version : '1'

[App]
; App config
Debug = true
backends :  [127.0.0.1, 192.168.1.2] ; backends
desc =
    This is a multi-line
    description.
params = {k: v, n: 1}
message = hi, ${USER}
timeout = 3.5      # seconds
release: null

[db]
# db config
host = ${DB_HOST:-localhost}
port= 3306
user = ${USER}
password =
db_uri = mysql://%(user)s:%(password)s@%(host)s:%(port)s/testdb?charset=utf8

加载方法

from filez import file

data = file.load_ini('testdata/data.ini')
assert data == {'App': {'Debug': True,
                        'backends': ['127.0.0.1', '192.168.1.2'],
                        'desc': 'This is a multi-line\ndescription.',
                        'message': ['hi', 'superhin'],
                        'params': {'k': 'v', 'n': 1},
                        'release': None,
                        'timeout': 3.5,
                        'version': '1'},
                'db': {'db_uri': 'mysql://superhin:@localhost:3306/testdb?charset=utf8',
                       'host': 'localhost',
                       'password': '',
                       'port': 3306,
                       'user': 'superhin',
                       'version': '1'}}

加载 JSON 文件

默认文件后缀名支持 .json 如果是其他后缀名,可以使用 file.load_json('xxx.xxx') 进行加载

特性:

  • 支持自动转换时间日期

例如: 数据文件: testdata/data.json

{  
  "name": "Alice",  
  "created_at": "2025-06-01T12:30:45",  
  "birthday": "1990-01-01"  
}

使用方法

from filez import file

data = file.load('testdata/data.json', parse_datetime=True)
assert data == {'birthday': date(1990, 1, 1),  
                'created_at': datetime(2025, 6, 1, 12, 30, 45),  
                'name': 'Alice'}

加载 YAML 文件

默认文件后缀名支持 .yml /.yaml,如果是其他后缀名,可以使用 file.load_yaml('xxx.xxx') 进行加载

特性:

  • 文本值中支持包含${ENV_KEY}直接引用环境变量值,支持环境变量带默认值
  • 支持构造器!merge,合并多个引用锚点列表值
  • 支持构造器!datetime,将ISO时间日期字符串转为datetime.datetime类型
  • 支持构造器!date,将ISO日期字符串转为datetime.date类型
  • 支持构造器!file,加载 json/yaml/toml/csv/ini/...文件数据到当前文件

例如: 数据文件: testdata/data.yaml

a: 1  
b: 2  
port: ${PORT}  
debug: ${DEBUG:-true}  
msg: port is ${PORT}  
list1: &list1 [1, 2, 3]  
list2: &list2 [4, 5]  
merged_list: !merge [*list1, *list2]  
file_data: !file ./data.json  
  
created: !datetime 2025-06-01T12:30:45  
created_ms: !datetime 2025-06-01T12:30:45.123456  
ts_sec:  !datetime 1717234245  
ts_ms:   !datetime 1717234245123  
  
birth: !date 1990-01-01  
birth_ts: !date 1717234245

设置环境变量

export PASSWORD=123456
export PORT=8888

使用方法

from filez import file

data = file.load('testdata/data.yaml', parse_datetime=True)
assert data == {'a': 1,  
                'b': 2,  
                'birth': date(1990, 1, 1),  
                'birth_ts': date(2024, 6, 1),  
                'created': datetime(2025, 6, 1, 12, 30, 45),  
                'created_ms': datetime(2025, 6, 1, 12, 30, 45, 123456),  
                'debug': 'true',  
                'file_data': {'birthday': date(1990, 1, 1),  
                              'created_at': datetime(2025, 6, 1, 12, 30, 45),  
                              'name': 'Alice'},  
                'list1': [1, 2, 3],  
                'list2': [4, 5],  
                'merged_list': {},  
                'msg': 'port is 8888',  
                'port': '8888',  
                'ts_ms': datetime(2024, 6, 1, 17, 30, 45, 123000),  
                'ts_sec': datetime(2024, 6, 1, 17, 30, 45)}

加载 TOML 文件

默认文件后缀名支持 .json 如果是其他后缀名,可以使用 file.load_json('xxx.xxx') 进行加载

特性:

例如: 数据文件: testdata/data.toml

{
  "a": 1,
  "b": 2
}

使用方法

from filez import file

data = file.load('testdata/data.toml')
assert data == {'a': 1, 'b': 2}

加载 CSV 或 Excel 文件

特性:

  • 支持跳过指定行
  • 支持带标题行
  • Excel支持加载单个表,多个表或所有表数据

例如: 数据文件: testdata/data.csv 或 testdata/data.xls Sheet1 或 testdata/data.xlsx Sheet1 数据

a b c
1 2.2 0
hello world

使用方法

from filez import file

data1 = file.load('testdata/data.csv')
assert data1 == [['a', 'b', 'c'], [1, 2.2, 0], ['hello', 'world', '']]

data2 = file.load('testdata/data.xls', skip=1)
assert data2 == [[1.0, 2.2, 0], ['hello', 'world', '']]

# load all_sheets:
data3 = file.load('testdata/data.xls', sheets='all')
assert data3 == {'Sheet1': [['a', 'b', 'c'], [1.0, 2.2, 0], ['hello', 'world', '']],
                 'Sheet2': [['a', 'b', 'c'], [1.0, 2.2, 0]]}

# load given_sheets: Sheet2
data4 = file.load('testdata/data.xls', skip=1, sheets=[1])
assert data4 == {'Sheet2': [[1.0, 2.2, 0]]}

data5 = file.load('testdata/data.xlsx', header=True)
assert data5 == [{'a': 1.0, 'b': 2.2, 'c': 0}, {'a': 'hello', 'b': 'world', 'c': ''}]

加载 XML 文件

特性:

  • 支持忽略属性,只保留节点标签及文本数据

例如:数据文件 testdata/data.xml

<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

使用方法

from filez import file

# default args :
#   ignore_attrs=False, 忽略节点属性
#   attr_key_prefix=':',  属性key前缀
#   child_tag_key_prefix='', 子节点标签名key前缀
#   default_text_key='text', 叶子节点既有属性又有text时,text值的默认key
#   empty_text=None, 叶子节点text为空时,默认value
data1 = file.load('testdata/data.xml')
assert data1 == {
  'bookstore':
    {'book': [
      {':category': 'COOKING',
       'author': 'Giada De Laurentiis',
       'price': '30.00',
       'title': {':lang': 'en', 'text': 'Everyday Italian'},
       'year': '2005'},
      {':category': 'WEB',
       'author': 'Erik T. Ray',
       'price': '39.95',
       'title': {':lang': 'en', 'text': 'Learning XML'},
       'year': '2003'}]}
}
# 忽略节点属性
data2 = file.load('testdata/data.xml', ignore_attrs=True)
assert data2 == {
  'bookstore':
    {'book': [
      {'author': 'Giada De Laurentiis',
       'price': '30.00',
       'title': 'Everyday Italian',
       'year': '2005'},
      {'author': 'Erik T. Ray',
       'price': '39.95',
       'title': 'Learning XML',
       'year': '2003'}
    ]}
}

加载 HTML 文件

特性:

例如:数据文件 tests/data.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <h1>标题</h1>
    <p>内容</p>
    <form name="form1" method="post">
        <input name="username" type="text">
        <input type="submit">
    </form>
  </body>
</html>

使用方法

from filez import file

data = file.load('testdata/data.html')
assert data == {
  'head': [
    {'tag': 'meta', 'attrs': {'charset': 'UTF-8'}, 'children': [], 'text': ''},
    {'tag': 'title', 'attrs': {}, 'children': [], 'text': 'Title'}],
  'body': [
    {'tag': 'h1', 'attrs': {}, 'children': [], 'text': '标题'},
    {'tag': 'p', 'attrs': {}, 'children': [], 'text': '内容'},
    {'tag': 'form', 'attrs': {'name': 'form1', 'method': 'post'}, 'children':
      [
        {'tag': 'input', 'attrs': {'name': 'username', 'type': 'text'}, 'children': [], 'text': ''},
        {'tag': 'input', 'attrs': {'type': 'submit'}, 'children': [], 'text': ''}
      ], 'text': ''}]}

加载 Properties 文件

数据文件 data.properties

appId=cactus

# key
publicKey=-----BEGIN PUBLIC KEY-----\n\
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9eQZFl3j5zZX8bmYYEznA0z3/X+\n\
TooIQ11rxFcPZsTvJPLCUY7NHasUenXJngmvRXSnP4odegaoe4usLDv/3A==\n\
-----END PUBLIC KEY-----

app.config.host=127.0.0.1
app.config.port=8080
from filez import file

data = file.load('testdata/data.properties')
assert data == {'appId': 'cactus',  
'publicKey': '-----BEGIN PUBLIC KEY-----\\n'  
			 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9eQZFl3j5zZX8bmYYEznA0z3/X+\\n'  
			 'TooIQ11rxFcPZsTvJPLCUY7NHasUenXJngmvRXSnP4odegaoe4usLDv/3A==\\n'  
			 '-----END PUBLIC KEY-----',  
'app': {'config': {'host': '127.0.0.1', 'port': '8080'}}}

加载 vCard3 通讯录文件

数据文件 testdata/data.cvf

BEGIN:VCARD  
VERSION:3.0  
FN:Alice Smith  
N:Smith;Alice;;;  
NICKNAME:Al  
NID:abc-123  
BDAY:1990-01-01  
TEL;TYPE=WORK,VOICE:+86-138-0000-0000  
TEL;TYPE=HOME,VOICE:+86-010-88888888  
EMAIL;TYPE=INTERNET,WORK:alice@example.com  
EMAIL;TYPE=INTERNET,HOME:alice.home@example.com  
ORG:Example Inc.  
TITLE:Software Engineer  
URL:https://alice.example.com  
ADR;TYPE=WORK:;;123 Main St;Beijing;;100000;China  
ADR;TYPE=HOME:;;456 Park Ave;Shanghai;;200000;China  
NOTE:Test contact for demo  
X-SOCIALPROFILE;TYPE=linkedin:https://linkedin.com/in/alicesmith  
END:VCARD

...
from filez import file

data = file.load('testdata/data.cvf')
print(data)
assert data == [
{'adr': ['',
		 '',
		 '123 Main St',
		 'Beijing',
		 '',
		 '100000',
		 'China',
		 ['', '', '456 Park Ave', 'Shanghai', '', '200000', 'China']],
 'bday': date(1990, 1, 1),
 'email': [{'types': ['INTERNET,WORK'], 'value': 'alice@example.com'},
		   {'types': ['INTERNET,HOME'], 'value': 'alice.home@example.com'}],
 'fn': 'Alice Smith',
 'n': ['Smith', 'Alice', '', '', ''],
 'nickname': 'Al',
 'nid': 'abc-123',
 'note': 'Test contact for demo',
 'org': ['Example Inc.'],
 'tel': [{'types': ['WORK,VOICE'], 'value': '+86-138-0000-0000'},
		 {'types': ['HOME,VOICE'], 'value': '+86-010-88888888'}],
 'title': 'Software Engineer',
 'url': 'https://alice.example.com',
 'version': '3.0',
 'x-socialprofile': 'https://linkedin.com/in/alicesmith'},
]

加载 XMind 文件

from filez import file

data = file.load('testdata/data.xmind')
print(data)

加载其他纯文本文件

特性:

  • 自动去除末尾\n

例如:数据文件 tests/data.txt

line1
line2
line3
line4

使用方法

from filez import file

data = file.load('tests/data.txt')
assert data == ['line1', 'line2', 'line3', 'line4']

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

filez-0.15.tar.gz (22.8 kB view details)

Uploaded Source

File details

Details for the file filez-0.15.tar.gz.

File metadata

  • Download URL: filez-0.15.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for filez-0.15.tar.gz
Algorithm Hash digest
SHA256 7e734978866e253f9830cbc18e540743c43a35953bb0940b47f2efa4add4853b
MD5 53f1a16ff1c96e0bd7db5f2b127e9ea3
BLAKE2b-256 686427fb85bf0a0f15a82cb5613037d5af54f5ebc925cf7b8891da6d93462dfc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page