【问题标题】:Iterate over row from Excel and slice them to store as list in python从 Excel 遍历行并将它们切片以存储为 python 中的列表
【发布时间】:2020-06-17 15:56:51
【问题描述】:

我正在使用 python 3 版本并使用 xlrd 包处理 excel 表 当前的excel表在单行中存储有价格数字,如下所示

price
10
22
34
45

这些数字将在服务器中自动生成,并且需要取出并存储在不同列表中的行值(一个列表的大小最大为 10),类似于

price_list_1 = price.row_values(10)
price_list_2 = price.row_values(11,20)
...
...

这样可以存储前 10 个值,然后将另外 10 个值递增存储到 price_list_2 等等。 目前为了打开和阅读我正在做如下。

Price_LIST = 'Daily_price_list/' + 'Price_List_2020.xlsx'
PriceList = xlrd.open_workbook(Price_LIST)
List = PriceList.sheet_by_index(0)

我在这里查看了一些答案并尝试了但没有成功。 在这里需要帮助。

编辑

我可以通过下面的代码做到这一点。

count = 0
for count in range(2, List.nrows):
    if count < 11:
        price_list_1 = List.row_values(count)
        print('\n Printing price_list_1\n',price_list_1)
    elif 10 < count < 21:
        price_list_2 = List.row_values(count)
        print('\n Printing price_list_2\n',price_list_2)
    elif 20 < count < 31:
        price_list_3 = List.row_values(count)
        print('\n Printing price_list_3\n',price_list_3)
    elif 30 < count < 41:
        price_list_4 = List.row_values(count)
        print('\n Printing price_list_4\n',price_list_4)
    elif 40 < count < 51:
        price_list_5 = List.row_values(count)
        print('\n Printing price_list_5\n',price_list_5)
        count + 1

有了这个,我可以在每个列表中用 10 个值拆分行。 有什么办法可以优化这个循环吗? 编辑-2 在运行上面的代码时,我遇到了另一个问题 当我从行中读取值时,我得到的值如下。

['10', '', '', '']

@Grismar 提供的澄清和指示帮助。 要添加,我有不同的线程(准确地说是 5 个)运行,每个价格从第一行开始直到它达到 NULL。并且每个线程将继续定价直到结束。

【问题讨论】:

  • 我是否正确假设您想要的是:从 Excel 工作表中读取单列数据(跳过标题);然后将数据分成最多 10 个项目的批次?您的解决方案似乎过于复杂,所以您还想在这里做什么?哪个声明导致列表['10', '', '', ''],您期望它是什么?
  • @Grismar:- 感谢您的回复,是的,您的假设是正确的。并使用 xlrd 我正在阅读 excel,但结果我得到的输出为 ['10', '', '', ''] 这是字符串,我无法使用它。所以,请提出更好的方法。
  • 请不要用更多真正与不同问题有关的问题来更新问题(或者可以说,您最初的问题与您最初遇到的问题无关) - 而是使用什么您已经从答案中学到了知识,如果您遇到更多问题,或者在解决方案方面需要帮助,请发布一个新问题。

标签: python list file-handling


【解决方案1】:

在您的代码中,您使用xlrd.open_workbook(Price_LIST) 阅读整个工作簿(.xlsx 格式),使用sheet_by_index(0) 选择第一个工作表,然后按行号继续循环该工作表的行(跳过标题) ,根据循环参数的值将行的值分配给变量。

这导致price_list_1 的值与第 10 行的值相同,price_list_2 的值与第 20 行的值相同,等等。

这不是您想要的,因为您似乎想要读取所有值,跳过标题并将列表划分为每个不超过 10 个元素的子列表(尽管不清楚为什么需要这个) .它也无法缩放,因为如果工作表的值超过 50 个,您会遇到问题。

只需要几行代码就可以达到预期的效果:

import xlrd

# get the first sheet from the workbook
price_sheet = xlrd.open_workbook('price.xlsx').sheet_by_index(0)

# get all the values from the first column, skipping the first line
values = price_sheet.col_values(0, 1)
# get values in groups of 10
groups_of_ten = [values[i:i+10] for i in range(0, len(values), 10)]

print(groups_of_ten)

【讨论】:

  • 所以基本上要详细说明,我有多个线程(最多 5 个)运行相同的进程但具有不同的 price_list。前任。我在列表中的 10 件套中有不同的价格。有了这些列表,我将为每个价格运行不同的线程以在线检查和比较。那些线程完成了它自己的列表,然后它可以从 main 更新,或者按照你的建议,可以更新每个线程处理的一个列表,但是当一个价格不可用并且第一个线程需要检查下一个价格时会很困难.
  • 如果您的目标是提供要在多个线程上处理的数据,您最好查看 Queue 类 docs.python.org/3/library/queue.html,它允许您在线程运行时从队列中读取价格完成,而不是批量同步价格。
  • 我认为在评论线程中进行对话既太长又太复杂 - 也远远超出了问题的范围。
  • 感谢队列类指针,如果您能指出一些实现示例将很有帮助,以便我理解和实现
  • 我认为这里的文档中有很好的示例? docs.python.org/3/library/queue.html 在“队列对象”下 - 您可能应该在那里举一些示例,尝试用它解决您的问题,如果遇到问题,请发布一个包含特定问题的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多