Python: 如何从 xlsx 文件中抓取语法数据?
Python: How do I syntax data scraping from xlsx file?
目前我正在从 xlsx 文件中抓取一些数据。我的代码有效,但看起来一团糟——至少对我而言。
所以我不确定我的代码是否符合 PEP8。
from openpyxl import load_workbook
[...]
for row in sheet.iter_rows():
id = row[0].value
name = row[1].value
second_name = row[2].value
# ignore the following
# middle_name = row[3].value
city = row[4].value
address = row[5].value
field_x = row[7].value
field_y = row[10].value
some_function_to_save_to_database(id, name, second_name, ...)
等(请注意,对于其中一些值,我会进行额外验证等)。
所以能用但是感觉有点"clunky"。显然我可以将它们直接传递给函数,使它成为 some_function_to_save_to_database(row[0].value, row[1].value, ...)
,但这样更好吗?感觉我在这一篇中失去了很多可读性。
所以我的问题如下:这是好的方法还是应该将这些字段的字段名称映射到行顺序?什么样的风格才是正确的抓取方式?
您的代码没有违反 PEP8。但是,这有点麻烦。如果数据发生变化,也不容易维护。也许你可以试试:
DATA_INDEX_MAP = {
'id' : 0,
'name' : 1,
'second_name' : 2,
'city' : 4,
'address' : 5,
'field_x' : 7,
'field_y' : 10
}
def get_data_from_row(row):
return {key:row[DATA_INDEX_MAP[key]].value for key in DATA_INDEX_MAP}
for row in sheet.iter_rows():
data = get_data_from_row(row)
some_function_to_save_to_database(**data)
那你只需要修改DATA_INDEX_MAP
.
中 dict
的更轻量级替代:
from operator import itemgetter
get_data = itemgetter(0, 1, 2, 4, 5, 7, 10)
for row in sheet.iter_rows():
data = [x.value for x in get_data(row)]
some_function_to_save_to_database(*data))
目前我正在从 xlsx 文件中抓取一些数据。我的代码有效,但看起来一团糟——至少对我而言。 所以我不确定我的代码是否符合 PEP8。
from openpyxl import load_workbook
[...]
for row in sheet.iter_rows():
id = row[0].value
name = row[1].value
second_name = row[2].value
# ignore the following
# middle_name = row[3].value
city = row[4].value
address = row[5].value
field_x = row[7].value
field_y = row[10].value
some_function_to_save_to_database(id, name, second_name, ...)
等(请注意,对于其中一些值,我会进行额外验证等)。
所以能用但是感觉有点"clunky"。显然我可以将它们直接传递给函数,使它成为 some_function_to_save_to_database(row[0].value, row[1].value, ...)
,但这样更好吗?感觉我在这一篇中失去了很多可读性。
所以我的问题如下:这是好的方法还是应该将这些字段的字段名称映射到行顺序?什么样的风格才是正确的抓取方式?
您的代码没有违反 PEP8。但是,这有点麻烦。如果数据发生变化,也不容易维护。也许你可以试试:
DATA_INDEX_MAP = {
'id' : 0,
'name' : 1,
'second_name' : 2,
'city' : 4,
'address' : 5,
'field_x' : 7,
'field_y' : 10
}
def get_data_from_row(row):
return {key:row[DATA_INDEX_MAP[key]].value for key in DATA_INDEX_MAP}
for row in sheet.iter_rows():
data = get_data_from_row(row)
some_function_to_save_to_database(**data)
那你只需要修改DATA_INDEX_MAP
.
dict
的更轻量级替代:
from operator import itemgetter
get_data = itemgetter(0, 1, 2, 4, 5, 7, 10)
for row in sheet.iter_rows():
data = [x.value for x in get_data(row)]
some_function_to_save_to_database(*data))