如何从 HDF5 文件中提取数据以填充 PyTables table?
How to extract data from HDF5 file to fill PyTables table?
我正在尝试在 Python 中编写一个 Discord 机器人。该机器人的目标是用用户的条目填充 table,其中检索用户名、游戏名称和游戏密码。然后,针对特定用户提取这些数据并删除已解决的条目。我使用在 google 上找到的第一个工具来管理 tables,因此 PyTables,我能够在 HDF5 文件中填充 table,但我无法检索它们。
重要的是要说我以前从未在 Python 中编码过。
这就是我声明对象并创建文件来存储条目的方式。
class DCParties (tables.IsDescription):
user_name=StringCol(32)
game_name=StringCol(16)
game_pswd=StringCol(16)
h5file = open_file("DCloneTable.h5", mode="w", title="DClone Table")
group = h5file.create_group("/", 'DCloneEntries', "Entries for DClone runs")
table = h5file.create_table(group, 'Entries', DCParties, "Entrées")
h5file.close()
这是我填写条目的方式
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
particle['user_name'] = member.author
particle['game_name'] = game_name
particle['game_pswd'] = game_pswd
particle.append()
table.flush()
h5file.close()
所有这些工作,我可以看到我的条目用 HDF5 查看器填充文件中的 table。
但是,我想读取我的 table,存储在文件中,以提取数据,但它不起作用。
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
"""???"""
h5file.close()
我尝试使用粒子 ["user_name"](因为 'user_name' 未定义),它给我 "b''" 作为输出
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
print(f'{particle["user_name"]}')
h5file.close()
b''
如果我这样做
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
print(f'{particle["user_name"]} - {particle["game_name"]} - {particle["game_pswd"]}')
h5file.close()
b'' - b'' - b''
我哪里失败了?非常感谢:)
这里有一个简单的方法来遍历 table 行并一次打印它们。
HDF5 不支持 Unicode 字符串,因此您的字符数据存储为字节字符串。这就是您看到 'b'
的原因。要摆脱 'b'
,您必须使用 .decode('utf-8')
转换回 Unicode。这适用于您的硬编码字段名称。您可以使用 table.colnames
中的值来处理任何列名。此外,我建议使用 Python 的文件上下文管理器 (with/as:
) 来避免让文件保持打开状态。
import tables as tb
with tb.open_file("DCloneTable.h5", mode="r") as h5file:
table = h5file.root.DCloneEntries.Entries
print(f'Table Column Names: {table.colnames}')
# Method to iterate over rows
for row in table:
print(f"{row['user_name'].decode('utf-8')} - " +
f"{row['game_name'].decode('utf-8')} - " +
f"{row['game_pswd'].decode('utf-8')}" )
# Method to only read the first row, aka table[0]
print(f"{table[0]['user_name'].decode('utf-8')} - " +
f"{table[0]['game_name'].decode('utf-8')} - " +
f"{table[0]['game_pswd'].decode('utf-8')}" )
如果你更喜欢一次读取所有数据,可以使用table.read()
方法将数据加载到一个NumPy结构化数组中。您仍然需要从字节转换为 Unicode。结果是“稍微复杂一点”,所以我没有post那个方法。
我正在尝试在 Python 中编写一个 Discord 机器人。该机器人的目标是用用户的条目填充 table,其中检索用户名、游戏名称和游戏密码。然后,针对特定用户提取这些数据并删除已解决的条目。我使用在 google 上找到的第一个工具来管理 tables,因此 PyTables,我能够在 HDF5 文件中填充 table,但我无法检索它们。
重要的是要说我以前从未在 Python 中编码过。
这就是我声明对象并创建文件来存储条目的方式。
class DCParties (tables.IsDescription):
user_name=StringCol(32)
game_name=StringCol(16)
game_pswd=StringCol(16)
h5file = open_file("DCloneTable.h5", mode="w", title="DClone Table")
group = h5file.create_group("/", 'DCloneEntries', "Entries for DClone runs")
table = h5file.create_table(group, 'Entries', DCParties, "Entrées")
h5file.close()
这是我填写条目的方式
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
particle['user_name'] = member.author
particle['game_name'] = game_name
particle['game_pswd'] = game_pswd
particle.append()
table.flush()
h5file.close()
所有这些工作,我可以看到我的条目用 HDF5 查看器填充文件中的 table。 但是,我想读取我的 table,存储在文件中,以提取数据,但它不起作用。
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
"""???"""
h5file.close()
我尝试使用粒子 ["user_name"](因为 'user_name' 未定义),它给我 "b''" 作为输出
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
print(f'{particle["user_name"]}')
h5file.close()
b''
如果我这样做
h5file = open_file("DCloneTable.h5", mode="a")
table = h5file.root.DCloneEntries.Entries
particle = table.row
print(f'{particle["user_name"]} - {particle["game_name"]} - {particle["game_pswd"]}')
h5file.close()
b'' - b'' - b''
我哪里失败了?非常感谢:)
这里有一个简单的方法来遍历 table 行并一次打印它们。
HDF5 不支持 Unicode 字符串,因此您的字符数据存储为字节字符串。这就是您看到 'b'
的原因。要摆脱 'b'
,您必须使用 .decode('utf-8')
转换回 Unicode。这适用于您的硬编码字段名称。您可以使用 table.colnames
中的值来处理任何列名。此外,我建议使用 Python 的文件上下文管理器 (with/as:
) 来避免让文件保持打开状态。
import tables as tb
with tb.open_file("DCloneTable.h5", mode="r") as h5file:
table = h5file.root.DCloneEntries.Entries
print(f'Table Column Names: {table.colnames}')
# Method to iterate over rows
for row in table:
print(f"{row['user_name'].decode('utf-8')} - " +
f"{row['game_name'].decode('utf-8')} - " +
f"{row['game_pswd'].decode('utf-8')}" )
# Method to only read the first row, aka table[0]
print(f"{table[0]['user_name'].decode('utf-8')} - " +
f"{table[0]['game_name'].decode('utf-8')} - " +
f"{table[0]['game_pswd'].decode('utf-8')}" )
如果你更喜欢一次读取所有数据,可以使用table.read()
方法将数据加载到一个NumPy结构化数组中。您仍然需要从字节转换为 Unicode。结果是“稍微复杂一点”,所以我没有post那个方法。