Table 存储SDK
Table Storage SDK
我正在尝试使用 Python 将 CSV 文件中的一些数据逐行加载到 Azure table 存储中。字符串列被直接插入,但源代码中提到的 2018-02-18T11:29:12.000Z
格式的日期列仍作为字符串加载。这意味着我无法使用日期列查询记录。
有人可以告诉我是否有办法为 table 创建实体定义(列的数据类型)并使用它来加载记录以避免加载字符串类型的日期?
我试图重现您的问题但失败了。我将 csv
文件加载到 Azure Table 存储,并将数据列加载为 DataTime
类型。
你可以参考我的代码如下:
我的csv文件:
'tasksSeattle','001','jay1',100,2018-02-18T11:29:12.000Z
'tasksSeattle','002','jay2',100,2018-02-18T11:29:12.000Z
'tasksSeattle','003','jay3',100,2018-02-18T11:29:12.000Z
'tasksSeattle','004','jay4',100,2018-02-18T11:29:12.000Z
'tasksSeattle','005','jay5',100,2018-02-18T11:29:12.000Z
我的python代码:
from azure.cosmosdb.table.tableservice import TableService
from azure.cosmosdb.table.models import Entity
import csv
import sys
import codecs
table_service = TableService(connection_string='***')
reload(sys)
sys.setdefaultencoding('utf-8')
filename = "E:/jay.csv"
with codecs.open(filename, 'rb', encoding="utf-8") as f_input:
csv_reader = csv.reader(f_input)
for row in csv_reader:
task = Entity()
task.PartitionKey = row[0]
task.RowKey = row[1]
task.description = row[2]
task.priority = row[3]
task.logtime = row[4]
table_service.insert_entity('tasktable', task)
加载结果:
希望对你有帮助。
更新答案:
如果您观察上面屏幕截图中的数据类型选项框,不难看出 Table 服务数据模型仅支持这 8 种类型:
- Edm.Binary
- Edm.Boolean
- Edm.DateTime
- Edm.Double
- Edm.Guid
- Edm.Int32
- Edm.Int64
- Edm.String
您可以使用 here 提到的 entity.x = EntityProperty(EdmType.STRING, 'y')
函数来定义您想要的数据类型。
请参考我的示例代码如下:
with codecs.open(filename, 'rb', encoding="utf-8") as f_input:
csv_reader = csv.reader(f_input)
for row in csv_reader:
task = Entity()
task.PartitionKey = row[0]
task.RowKey = row[1]
task.description = row[2]
task.priority = EntityProperty(EdmType.INT32, row[3])
task.logtime = EntityProperty(EdmType.DATETIME, row[4])
table_service.insert_entity('tasktable', task)
仅作总结:
我们可以将字符串转换为日期时间并得到日期片段,如下所示:
task.startDateTime = datetime(startDateFrag.year,startDateFrag.month,startDateFrag.day,startDateFrag.hour, startDateFrag.minute,startDateFrag.second)
由于缺乏声誉,我无法对 Jay 的回答发表评论,只是添加了有关如何从字符串进行日期转换的代码部分。
from dateutil.parser import parse
from datetime import datetime
try:
dt = parse(row[4]);
if(isinstance(dt,datetime.date)):
task.logtime = EntityProperty(EdmType.DATETIME, dt)
except ValueError as err:
task.logtime=row[4]
如果您正在动态读取 json 而您不知道每个字段的数据类型,则可以使用 try/except 块。
我正在尝试使用 Python 将 CSV 文件中的一些数据逐行加载到 Azure table 存储中。字符串列被直接插入,但源代码中提到的 2018-02-18T11:29:12.000Z
格式的日期列仍作为字符串加载。这意味着我无法使用日期列查询记录。
有人可以告诉我是否有办法为 table 创建实体定义(列的数据类型)并使用它来加载记录以避免加载字符串类型的日期?
我试图重现您的问题但失败了。我将 csv
文件加载到 Azure Table 存储,并将数据列加载为 DataTime
类型。
你可以参考我的代码如下:
我的csv文件:
'tasksSeattle','001','jay1',100,2018-02-18T11:29:12.000Z
'tasksSeattle','002','jay2',100,2018-02-18T11:29:12.000Z
'tasksSeattle','003','jay3',100,2018-02-18T11:29:12.000Z
'tasksSeattle','004','jay4',100,2018-02-18T11:29:12.000Z
'tasksSeattle','005','jay5',100,2018-02-18T11:29:12.000Z
我的python代码:
from azure.cosmosdb.table.tableservice import TableService
from azure.cosmosdb.table.models import Entity
import csv
import sys
import codecs
table_service = TableService(connection_string='***')
reload(sys)
sys.setdefaultencoding('utf-8')
filename = "E:/jay.csv"
with codecs.open(filename, 'rb', encoding="utf-8") as f_input:
csv_reader = csv.reader(f_input)
for row in csv_reader:
task = Entity()
task.PartitionKey = row[0]
task.RowKey = row[1]
task.description = row[2]
task.priority = row[3]
task.logtime = row[4]
table_service.insert_entity('tasktable', task)
加载结果:
希望对你有帮助。
更新答案:
如果您观察上面屏幕截图中的数据类型选项框,不难看出 Table 服务数据模型仅支持这 8 种类型:
- Edm.Binary
- Edm.Boolean
- Edm.DateTime
- Edm.Double
- Edm.Guid
- Edm.Int32
- Edm.Int64
- Edm.String
您可以使用 here 提到的 entity.x = EntityProperty(EdmType.STRING, 'y')
函数来定义您想要的数据类型。
请参考我的示例代码如下:
with codecs.open(filename, 'rb', encoding="utf-8") as f_input:
csv_reader = csv.reader(f_input)
for row in csv_reader:
task = Entity()
task.PartitionKey = row[0]
task.RowKey = row[1]
task.description = row[2]
task.priority = EntityProperty(EdmType.INT32, row[3])
task.logtime = EntityProperty(EdmType.DATETIME, row[4])
table_service.insert_entity('tasktable', task)
仅作总结:
我们可以将字符串转换为日期时间并得到日期片段,如下所示:
task.startDateTime = datetime(startDateFrag.year,startDateFrag.month,startDateFrag.day,startDateFrag.hour, startDateFrag.minute,startDateFrag.second)
由于缺乏声誉,我无法对 Jay 的回答发表评论,只是添加了有关如何从字符串进行日期转换的代码部分。
from dateutil.parser import parse
from datetime import datetime
try:
dt = parse(row[4]);
if(isinstance(dt,datetime.date)):
task.logtime = EntityProperty(EdmType.DATETIME, dt)
except ValueError as err:
task.logtime=row[4]
如果您正在动态读取 json 而您不知道每个字段的数据类型,则可以使用 try/except 块。