Jekyll2023-03-11T15:14:08+00:00http://www.coderli.com/atom.xmlOneCoderonecoder's blog.LiHongZhePython实战-生成版本排期Excel2023-03-11T13:13:24+00:002023-03-11T13:13:24+00:00http://www.coderli.com/python-using-version-excel<p>最新工作很忙,需要做一个整体项目和版本排期的大表。幸亏之前学了一点Python,尝试用Python处理数学,生成所需要表格。主要用到了pandas、xlsxwriter等工具包。代码并不具备什么通用性,可能写的也很啰嗦,不过好在也算用Python为自己做了一项实用的工作。下面代码中,一些工作信息隐去了。</p>
<!--more-->
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">import</span> <span class="nn">openpyxl</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="s">"./resources/系统版本计划统筹表.xlsx"</span>
<span class="n">input_sheet_name</span> <span class="o">=</span> <span class="s">"3-项目版本统筹"</span>
<span class="n">out_file_path</span> <span class="o">=</span> <span class="s">"./resources/"</span>
<span class="n">out_sheet_name</span> <span class="o">=</span> <span class="s">"版本排布-总览"</span>
<span class="n">out_sheet_name_trans_withoutxc</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_trade</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_clear</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_delivery</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_supervise</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_member</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_otc</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_data</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_risk_management</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_other</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_product_line</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_index</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_project_name</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_project_simple_name</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_project_approval_state</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_project_stage</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_if_xc</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_expected_time</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_time_line</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_online_time</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_if_decision</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_explanation</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_trade</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_clear</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_clear_old</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_delivery</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_supervise</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_otc</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_member</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_index</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_dwr</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_risk_management</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_data</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_data_old</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_website</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_deliveryapp</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_system_bean2</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="n">col_name_new_project_count</span> <span class="o">=</span> <span class="s">"**"</span>
<span class="c1"># 读取Excel
</span><span class="k">def</span> <span class="nf">read_excel</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">sheet_name</span><span class="p">):</span>
<span class="n">workbook</span> <span class="o">=</span> <span class="n">openpyxl</span><span class="p">.</span><span class="n">load_workbook</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="n">file_path</span><span class="p">,</span> <span class="n">data_only</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_excel</span><span class="p">(</span><span class="n">workbook</span><span class="p">,</span> <span class="n">sheet_name</span><span class="o">=</span><span class="n">sheet_name</span><span class="p">,</span> <span class="n">engine</span><span class="o">=</span><span class="s">'openpyxl'</span><span class="p">)</span>
<span class="c1"># 定义输出表格
</span><span class="k">def</span> <span class="nf">create_out_frame</span><span class="p">():</span>
<span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span> <span class="n">col_name_product_delivery</span><span class="p">,</span> <span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_otc</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">,</span> <span class="n">col_name_time_line</span><span class="p">,</span> <span class="n">col_name_online_time</span><span class="p">,</span> <span class="n">col_name_system_trade</span><span class="p">,</span>
<span class="n">col_name_system_clear</span><span class="p">,</span> <span class="n">col_name_system_clear_old</span><span class="p">,</span> <span class="n">col_name_system_delivery</span><span class="p">,</span> <span class="n">col_name_system_supervise</span><span class="p">,</span>
<span class="n">col_name_system_otc</span><span class="p">,</span> <span class="n">col_name_system_member</span><span class="p">,</span> <span class="n">col_name_system_index</span><span class="p">,</span> <span class="n">col_name_system_dwr</span><span class="p">,</span>
<span class="n">col_name_system_risk_management</span><span class="p">,</span> <span class="n">col_name_system_data</span><span class="p">,</span> <span class="n">col_name_system_data_old</span><span class="p">,</span> <span class="n">col_name_system_website</span><span class="p">,</span>
<span class="n">col_name_system_deliveryapp</span><span class="p">,</span> <span class="n">col_name_system_bean2</span>
<span class="p">]</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="n">columns</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">fill_the_frame</span><span class="p">(</span><span class="n">source_df</span><span class="p">,</span> <span class="n">result_frame</span><span class="p">):</span>
<span class="c1"># 1.对读入数据按照上线时间排序
</span> <span class="n">source_df</span><span class="p">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="n">col_name_online_time</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1"># 2.插入上线时间列
</span> <span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_online_time</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">source_df</span><span class="p">[</span><span class="n">col_name_online_time</span><span class="p">],</span>
<span class="n">errors</span><span class="o">=</span><span class="s">'coerce'</span><span class="p">).</span><span class="n">dt</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">'%m/%d'</span><span class="p">)</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_time_line</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">source_df</span><span class="p">[</span><span class="n">col_name_online_time</span><span class="p">],</span>
<span class="n">errors</span><span class="o">=</span><span class="s">'coerce'</span><span class="p">).</span><span class="n">dt</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">'%Y-%m'</span><span class="p">)</span>
<span class="c1"># 3.插入版本号列
</span> <span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_trade</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_trade</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_clear</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_clear</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_clear_old</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_clear_old</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_delivery</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_delivery</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_supervise</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_supervise</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_otc</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_otc</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_member</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_member</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_index</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_dwr</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_dwr</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_risk_management</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_risk_management</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_data</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_data</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_data_old</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_data_old</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_website</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_website</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_deliveryapp</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_deliveryapp</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_system_bean2</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_system_bean2</span><span class="p">]</span>
<span class="n">result_frame</span><span class="p">[</span><span class="n">col_name_project_approval_state</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_df</span><span class="p">[</span><span class="n">col_name_project_approval_state</span><span class="p">]</span>
<span class="c1"># 4.填充项目列
</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">source_df</span><span class="p">.</span><span class="n">itertuples</span><span class="p">():</span>
<span class="n">cur_product_line_name</span> <span class="o">=</span> <span class="n">row</span><span class="p">.</span><span class="n">产品线</span>
<span class="n">result_frame</span><span class="p">.</span><span class="n">at</span><span class="p">[(</span><span class="n">row</span><span class="p">.</span><span class="n">Index</span><span class="p">,),</span> <span class="n">cur_product_line_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">row</span><span class="p">.</span><span class="n">简称</span>
<span class="c1"># 按行合并
</span><span class="k">def</span> <span class="nf">merge_row</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="nb">format</span><span class="p">,</span> <span class="n">df</span><span class="p">,</span> <span class="n">sheet</span><span class="p">):</span>
<span class="n">time_line_row</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">row_num</span><span class="p">]</span>
<span class="n">start_cell_index</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">end_cell_index</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">last_cell_val</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">total_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">time_line_row</span><span class="p">)</span>
<span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">time_line_row</span><span class="p">:</span>
<span class="c1"># 刚合并过
</span> <span class="k">if</span> <span class="n">start_cell_index</span> <span class="o">==</span> <span class="n">end_cell_index</span><span class="p">:</span>
<span class="k">if</span> <span class="n">end_cell_index</span> <span class="o">==</span> <span class="n">total_count</span><span class="p">:</span>
<span class="c1"># 处理最后一个单元格
</span> <span class="n">sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="n">end_cell_index</span><span class="p">,</span> <span class="n">cell</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">end_cell_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">last_cell_val</span> <span class="o">=</span> <span class="n">cell</span>
<span class="k">continue</span>
<span class="c1"># 如果值相同,索引+1
</span> <span class="k">if</span> <span class="n">cell</span> <span class="o">==</span> <span class="n">last_cell_val</span><span class="p">:</span>
<span class="c1"># 处理最后一个单元格
</span> <span class="k">if</span> <span class="n">end_cell_index</span> <span class="o">==</span> <span class="n">total_count</span><span class="p">:</span>
<span class="n">sheet</span><span class="p">.</span><span class="n">merge_range</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="n">start_cell_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">row_num</span><span class="p">,</span> <span class="n">end_cell_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">cell</span><span class="p">,</span>
<span class="nb">format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">end_cell_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># 单一值单元格
</span> <span class="k">if</span> <span class="n">end_cell_index</span> <span class="o">-</span> <span class="n">start_cell_index</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="n">start_cell_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last_cell_val</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span>
<span class="k">if</span> <span class="n">end_cell_index</span> <span class="o">==</span> <span class="n">total_count</span><span class="p">:</span>
<span class="n">sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="n">end_cell_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cell</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sheet</span><span class="p">.</span><span class="n">merge_range</span><span class="p">(</span><span class="n">row_num</span><span class="p">,</span> <span class="n">start_cell_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">row_num</span><span class="p">,</span> <span class="n">end_cell_index</span><span class="p">,</span>
<span class="n">last_cell_val</span><span class="p">,</span>
<span class="nb">format</span><span class="p">)</span>
<span class="n">start_cell_index</span> <span class="o">=</span> <span class="n">end_cell_index</span>
<span class="n">end_cell_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">last_cell_val</span> <span class="o">=</span> <span class="n">cell</span>
<span class="k">def</span> <span class="nf">write_result</span><span class="p">(</span><span class="n">writer</span><span class="p">,</span> <span class="n">result_frame</span><span class="p">):</span>
<span class="n">result_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"all"</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">result_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"all"</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1"># 总览
</span> <span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">result_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="n">out_sheet_name</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
<span class="c1"># 交易
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_clear</span><span class="p">,</span> <span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_otc</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"1-交易"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 清算
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_otc</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_clear</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"2-清算"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 交割
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_otc</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_delivery</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"3-交割"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 监查
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_otc</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_supervise</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"4-监查"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 场外
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_otc</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"5-场外"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 会服
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_otc</span><span class="p">,</span> <span class="n">col_name_product_data</span><span class="p">,</span> <span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_member</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"6-会服"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 数据
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_otc</span><span class="p">,</span> <span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_data</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"7-数据"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># 其他
</span> <span class="n">trade_frame</span> <span class="o">=</span> <span class="n">result_frame</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_trade</span><span class="p">,</span> <span class="n">col_name_product_clear</span><span class="p">,</span>
<span class="n">col_name_product_delivery</span><span class="p">,</span>
<span class="n">col_name_product_otc</span><span class="p">,</span> <span class="n">col_name_product_member</span><span class="p">,</span> <span class="n">col_name_product_supervise</span><span class="p">,</span>
<span class="n">col_name_product_data</span><span class="p">])</span>
<span class="n">trade_frame</span><span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">"any"</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_product_other</span><span class="p">])</span>
<span class="n">_trans_to_sheet</span><span class="p">(</span><span class="n">trade_frame</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="s">"8-其他"</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_trans_to_sheet</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="n">sheet_name</span><span class="p">,</span> <span class="n">is_all</span><span class="p">):</span>
<span class="n">final_result_frame</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">drop</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="n">col_name_project_approval_state</span><span class="p">])</span>
<span class="n">ori_trans_frame</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">transpose</span><span class="p">(</span><span class="n">copy</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">ori_trans_frame</span><span class="p">.</span><span class="n">set_index</span><span class="p">(</span><span class="n">ori_trans_frame</span><span class="p">.</span><span class="n">index</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1"># 5.转置输出
</span> <span class="n">result_frame_trans</span> <span class="o">=</span> <span class="n">final_result_frame</span><span class="p">.</span><span class="n">transpose</span><span class="p">(</span><span class="n">copy</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1"># 加一列索引列
</span> <span class="n">result_frame_trans</span><span class="p">.</span><span class="n">set_index</span><span class="p">(</span><span class="n">result_frame_trans</span><span class="p">.</span><span class="n">index</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1"># 6.处理时间线列-合并单元格
</span> <span class="n">result_frame_trans</span><span class="p">.</span><span class="n">to_excel</span><span class="p">(</span><span class="n">writer</span><span class="p">,</span> <span class="n">sheet_name</span><span class="o">=</span><span class="n">sheet_name</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">out_sheet</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">sheets</span><span class="p">[</span><span class="n">sheet_name</span><span class="p">]</span>
<span class="n">sheet_table</span> <span class="o">=</span> <span class="n">out_sheet</span><span class="p">.</span><span class="n">table</span>
<span class="n">row_counts</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">sheet_table</span><span class="p">)</span>
<span class="c1"># 交替设置行样式
</span> <span class="n">odd_row_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"D9D9D9"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"微软雅黑"</span><span class="p">,</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="p">})</span>
<span class="n">even_row_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"F2F2F2"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"微软雅黑"</span><span class="p">,</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="p">})</span>
<span class="n">project_cell_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"4F81BD"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"Times New Roman"</span><span class="p">,</span>
<span class="s">"font_color"</span><span class="p">:</span> <span class="s">"white"</span><span class="p">,</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="s">"text_wrap"</span><span class="p">:</span> <span class="bp">True</span>
<span class="p">})</span>
<span class="n">new_project_cell_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"00B050"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"Times New Roman"</span><span class="p">,</span>
<span class="s">"font_color"</span><span class="p">:</span> <span class="s">"white"</span><span class="p">,</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="s">"text_wrap"</span><span class="p">:</span> <span class="bp">True</span>
<span class="p">})</span>
<span class="n">version_cell_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"BFBFBF"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"Times New Roman"</span><span class="p">,</span>
<span class="s">"font_color"</span><span class="p">:</span> <span class="s">"black"</span><span class="p">,</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="s">"text_wrap"</span><span class="p">:</span> <span class="bp">True</span>
<span class="p">})</span>
<span class="n">merge_cell_format</span> <span class="o">=</span> <span class="n">writer</span><span class="p">.</span><span class="n">book</span><span class="p">.</span><span class="n">add_format</span><span class="p">({</span>
<span class="s">"bold"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">"border"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="s">"align"</span><span class="p">:</span> <span class="s">"center"</span><span class="p">,</span>
<span class="s">"valign"</span><span class="p">:</span> <span class="s">"vcenter"</span><span class="p">,</span>
<span class="s">"fg_color"</span><span class="p">:</span> <span class="s">"1F497D"</span><span class="p">,</span>
<span class="s">"font_color"</span><span class="p">:</span> <span class="s">"white"</span><span class="p">,</span>
<span class="s">"font_name"</span><span class="p">:</span> <span class="s">"Times New Roman"</span><span class="p">,</span>
<span class="s">"border_color"</span><span class="p">:</span> <span class="s">"808080"</span>
<span class="p">})</span>
<span class="n">time_line_row_num</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">online_time_row_num</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">is_all</span><span class="p">:</span>
<span class="n">time_line_row_num</span> <span class="o">=</span> <span class="mi">8</span>
<span class="n">online_time_row_num</span> <span class="o">=</span> <span class="mi">9</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">time_line_row_num</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">online_time_row_num</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">for</span> <span class="n">row_index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">row_counts</span><span class="p">):</span>
<span class="n">table_row</span> <span class="o">=</span> <span class="n">sheet_table</span><span class="p">[</span><span class="n">row_index</span><span class="p">]</span>
<span class="n">cur_cell_format</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">row_index</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="o">=</span><span class="n">row_index</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">cell_format</span><span class="o">=</span><span class="n">even_row_format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="o">=</span><span class="n">row_index</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">cell_format</span><span class="o">=</span><span class="n">odd_row_format</span><span class="p">)</span>
<span class="k">if</span> <span class="n">time_line_row_num</span> <span class="o"><=</span> <span class="n">row_index</span> <span class="o"><=</span> <span class="n">online_time_row_num</span><span class="p">:</span>
<span class="n">cur_cell_format</span> <span class="o">=</span> <span class="n">merge_cell_format</span>
<span class="k">elif</span> <span class="n">row_index</span> <span class="o">></span> <span class="n">online_time_row_num</span><span class="p">:</span>
<span class="n">cur_cell_format</span> <span class="o">=</span> <span class="n">version_cell_format</span>
<span class="k">for</span> <span class="n">col_idx</span> <span class="ow">in</span> <span class="n">table_row</span><span class="p">:</span>
<span class="k">if</span> <span class="n">col_idx</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">col_idx</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">ori_trans_frame</span><span class="p">.</span><span class="n">index</span><span class="p">[</span><span class="n">row_index</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">cur_idx_format</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">row_index</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">cur_idx_format</span> <span class="o">=</span> <span class="n">even_row_format</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cur_idx_format</span> <span class="o">=</span> <span class="n">odd_row_format</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">row_index</span><span class="p">,</span> <span class="n">col_idx</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">cur_idx_format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">row_index</span> <span class="o"><</span> <span class="n">time_line_row_num</span><span class="p">:</span>
<span class="n">cur_cell_format</span> <span class="o">=</span> <span class="n">project_cell_format</span>
<span class="n">if_new_project</span> <span class="o">=</span> <span class="n">ori_trans_frame</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">row_counts</span><span class="p">,</span> <span class="n">col_idx</span> <span class="o">-</span> <span class="mi">2</span><span class="p">]</span>
<span class="k">if</span> <span class="n">if_new_project</span> <span class="o">==</span> <span class="s">"待立项"</span><span class="p">:</span>
<span class="n">cur_cell_format</span> <span class="o">=</span> <span class="n">new_project_cell_format</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">ori_trans_frame</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">row_index</span><span class="p">,</span> <span class="n">col_idx</span> <span class="o">-</span> <span class="mi">2</span><span class="p">]</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">row_index</span><span class="p">,</span> <span class="n">col_idx</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">cur_cell_format</span><span class="p">)</span>
<span class="c1"># 合并项目、系统和时间轴
</span> <span class="k">if</span> <span class="n">is_all</span><span class="p">:</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">merge_range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">time_line_row_num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">"项目"</span><span class="p">,</span>
<span class="n">merge_cell_format</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s">"项目"</span><span class="p">,</span> <span class="n">merge_cell_format</span><span class="p">)</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">merge_range</span><span class="p">(</span><span class="n">time_line_row_num</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">online_time_row_num</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">"时间轴"</span><span class="p">,</span>
<span class="n">merge_cell_format</span><span class="p">)</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">merge_range</span><span class="p">(</span><span class="n">online_time_row_num</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">row_counts</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">"系统"</span><span class="p">,</span>
<span class="n">merge_cell_format</span><span class="p">)</span>
<span class="n">merge_row</span><span class="p">(</span><span class="n">time_line_row_num</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">merge_cell_format</span><span class="p">,</span> <span class="n">sheet</span><span class="o">=</span><span class="n">out_sheet</span><span class="p">,</span> <span class="n">df</span><span class="o">=</span><span class="n">result_frame_trans</span><span class="p">)</span>
<span class="n">merge_row</span><span class="p">(</span><span class="n">online_time_row_num</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">merge_cell_format</span><span class="p">,</span> <span class="n">sheet</span><span class="o">=</span><span class="n">out_sheet</span><span class="p">,</span> <span class="n">df</span><span class="o">=</span><span class="n">result_frame_trans</span><span class="p">)</span>
<span class="c1"># 7.设置样式
</span> <span class="c1"># 列宽
</span> <span class="n">out_sheet</span><span class="p">.</span><span class="n">set_column</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="n">out_sheet</span><span class="p">.</span><span class="n">set_column</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">write_detail_table</span><span class="p">(</span><span class="n">source_df</span><span class="p">,</span> <span class="n">writer</span><span class="p">):</span>
<span class="c1"># 定义输出的DataFrame
</span> <span class="n">result_frame</span> <span class="o">=</span> <span class="n">create_out_frame</span><span class="p">()</span>
<span class="c1"># 遍历填写数据1
</span> <span class="n">fill_the_frame</span><span class="p">(</span><span class="n">source_df</span><span class="p">,</span> <span class="n">result_frame</span><span class="p">)</span>
<span class="c1"># 输出结果
</span> <span class="n">write_result</span><span class="p">(</span><span class="n">writer</span><span class="p">,</span> <span class="n">result_frame</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">():</span>
<span class="n">currentDateAndTime</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span>
<span class="n">time_str</span> <span class="o">=</span> <span class="n">currentDateAndTime</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">"%Y%m%d(%H%M)"</span><span class="p">)</span>
<span class="n">out_file</span> <span class="o">=</span> <span class="n">out_file_path</span> <span class="o">+</span> <span class="n">time_str</span> <span class="o">+</span> <span class="s">"版本排布.xlsx"</span>
<span class="n">writer</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">ExcelWriter</span><span class="p">(</span><span class="n">out_file</span><span class="p">,</span>
<span class="n">engine</span><span class="o">=</span><span class="s">'xlsxwriter'</span><span class="p">,</span>
<span class="n">date_format</span><span class="o">=</span><span class="s">'yyyy-dd-mm'</span><span class="p">)</span>
<span class="c1"># 读取源数据到DataFrame
</span> <span class="n">source_df</span> <span class="o">=</span> <span class="n">read_excel</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">input_sheet_name</span><span class="p">)</span>
<span class="c1"># 输出明细数据
</span> <span class="n">write_detail_table</span><span class="p">(</span><span class="n">source_df</span><span class="p">,</span> <span class="n">writer</span><span class="p">)</span>
<span class="c1"># 输出统计数据
</span> <span class="c1"># write_statistic_tables(source_df, writer)
</span> <span class="n">writer</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">run</span><span class="p">()</span>
</code></pre></div></div>onecoder最新工作很忙,需要做一个整体项目和版本排期的大表。幸亏之前学了一点Python,尝试用Python处理数学,生成所需要表格。主要用到了pandas、xlsxwriter等工具包。代码并不具备什么通用性,可能写的也很啰嗦,不过好在也算用Python为自己做了一项实用的工作。下面代码中,一些工作信息隐去了。Python瞎学瞎用2023-02-01T15:00:24+00:002023-02-01T15:00:24+00:00http://www.coderli.com/python-learning-and-using.md<p>很久没有更新博客了,有年底很忙的原因,也有在学习用Python瞎鼓捣点什么的因素,其实我并没有停止学习。</p>
<p>学了一段时间Python,本身有开发基础,总想着用Python鼓捣点什么我自己用的上的东西,所以从去年11月开始,就开始学习研究Python GUI编程,现在每天学学写写,走走停停,也算有所积累吧。</p>
<p>当然,还没什么见的人的成果,不过也可以考虑把阶段性代码更新上来,权当记录和一乐了。</p>
<p>2023年,祝自己好运,心想事成。</p>
<!--more-->
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="n">tk</span>
<span class="kn">import</span> <span class="nn">tkinter.ttk</span> <span class="k">as</span> <span class="n">ttk</span>
<span class="kn">from</span> <span class="nn">tkinter</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">tkinter</span> <span class="kn">import</span> <span class="n">messagebox</span>
<span class="kn">from</span> <span class="nn">project.data.data_handler</span> <span class="kn">import</span> <span class="n">ProjectHandler</span>
<span class="kn">from</span> <span class="nn">project.gui.const_ui</span> <span class="kn">import</span> <span class="n">ui_const</span>
<span class="kn">from</span> <span class="nn">project.gui.ui_dialog</span> <span class="kn">import</span> <span class="n">NewProjectDialog</span><span class="p">,</span> <span class="n">ProjectDetailDialog</span>
<span class="k">class</span> <span class="nc">Main_UI</span><span class="p">(</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">().</span><span class="n">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_cur_index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_view_pro_button</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_edit_button</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_ph</span> <span class="o">=</span> <span class="n">ProjectHandler</span><span class="p">()</span>
<span class="o">@</span><span class="nb">property</span>
<span class="k">def</span> <span class="nf">main_table</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span>
<span class="o">@</span><span class="n">main_table</span><span class="p">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">main_table</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span> <span class="o">=</span> <span class="n">table</span>
<span class="o">@</span><span class="nb">property</span>
<span class="k">def</span> <span class="nf">cur_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">_cur_index</span>
<span class="o">@</span><span class="n">cur_index</span><span class="p">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">cur_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_cur_index</span> <span class="o">=</span> <span class="n">index</span>
<span class="c1"># 加载主页面
</span> <span class="k">def</span> <span class="nf">do_load</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># 加载中窗口信息
</span> <span class="bp">self</span><span class="p">.</span><span class="n">load_main_info</span><span class="p">()</span>
<span class="c1"># 加载菜单
</span> <span class="bp">self</span><span class="p">.</span><span class="n">load_menu</span><span class="p">()</span>
<span class="c1"># 加载表格
</span> <span class="bp">self</span><span class="p">.</span><span class="n">load_project_table</span><span class="p">()</span>
<span class="c1"># 加载按钮
</span> <span class="bp">self</span><span class="p">.</span><span class="n">load_buttons</span><span class="p">()</span>
<span class="c1"># 设置按钮
</span> <span class="k">def</span> <span class="nf">load_buttons</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># 设置button_frame
</span> <span class="n">button_frame</span> <span class="o">=</span> <span class="n">Frame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">button_frame</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">pady</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">X</span><span class="p">)</span>
<span class="c1"># 设置按钮
</span> <span class="n">view_project_button</span> <span class="o">=</span> <span class="n">tk</span><span class="p">.</span><span class="n">Button</span><span class="p">(</span><span class="n">button_frame</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"查看项目详情"</span><span class="p">,</span> <span class="n">takefocus</span><span class="o">=</span><span class="n">TRUE</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="n">DISABLED</span><span class="p">,</span>
<span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">view_project_detail_command</span><span class="p">)</span>
<span class="n">new_project_button</span> <span class="o">=</span> <span class="n">tk</span><span class="p">.</span><span class="n">Button</span><span class="p">(</span><span class="n">button_frame</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"新增项目"</span><span class="p">,</span> <span class="n">takefocus</span><span class="o">=</span><span class="n">TRUE</span><span class="p">,</span>
<span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">new_project_command</span><span class="p">)</span>
<span class="n">remove_project_button</span> <span class="o">=</span> <span class="n">tk</span><span class="p">.</span><span class="n">Button</span><span class="p">(</span><span class="n">button_frame</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"删除项目"</span><span class="p">,</span> <span class="n">takefocus</span><span class="o">=</span><span class="n">TRUE</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="n">DISABLED</span><span class="p">,</span>
<span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">delete_project_command</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_del_pro_button</span> <span class="o">=</span> <span class="n">remove_project_button</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_view_pro_button</span> <span class="o">=</span> <span class="n">view_project_button</span>
<span class="n">remove_project_button</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">ipadx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">padx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="n">RIGHT</span><span class="p">)</span>
<span class="n">new_project_button</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">ipadx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="n">RIGHT</span><span class="p">)</span>
<span class="n">view_project_button</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">ipadx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">padx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">side</span><span class="o">=</span><span class="n">RIGHT</span><span class="p">)</span>
<span class="c1"># 弹出新建项目窗口
</span> <span class="k">def</span> <span class="nf">open_new_project_page</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Open new project dialog"</span><span class="p">)</span>
<span class="n">inputDialog</span> <span class="o">=</span> <span class="n">NewProjectDialog</span><span class="p">()</span>
<span class="bp">self</span><span class="p">.</span><span class="n">wait_window</span><span class="p">(</span><span class="n">inputDialog</span><span class="p">)</span>
<span class="k">return</span> <span class="n">inputDialog</span><span class="p">.</span><span class="n">_project</span>
<span class="k">def</span> <span class="nf">open_project_detail_page</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<span class="n">project_detail_dialog</span> <span class="o">=</span> <span class="n">ProjectDetailDialog</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="s">"values"</span><span class="p">])</span>
<span class="bp">self</span><span class="p">.</span><span class="n">wait_window</span><span class="p">(</span><span class="n">project_detail_dialog</span><span class="p">)</span>
<span class="c1"># 查看项目详情
</span> <span class="k">def</span> <span class="nf">view_project_detail_command</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">item_id</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">selection</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">item</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">item</span><span class="p">(</span><span class="n">item_id</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">open_project_detail_page</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">delete_project_command</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">confirm</span> <span class="o">=</span> <span class="n">messagebox</span><span class="p">.</span><span class="n">askokcancel</span><span class="p">(</span><span class="s">'提示'</span><span class="p">,</span> <span class="s">'确定删除项目吗,项目所有数据将被清除?'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">confirm</span><span class="p">:</span>
<span class="n">selected_list</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">selection</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Delete projects:"</span><span class="p">,</span> <span class="n">selected_list</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_ph</span><span class="p">.</span><span class="n">delete_projects_by_code</span><span class="p">(</span><span class="n">selected_list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">selected_list</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Cancel deleting project."</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">new_project_command</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">open_new_project_page</span><span class="p">()</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_insert_one_project</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_cur_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">def</span> <span class="nf">load_main_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="n">ui_const</span><span class="p">.</span><span class="n">MAIN_TITLE</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">geometry</span><span class="p">(</span><span class="n">ui_const</span><span class="p">.</span><span class="n">WINDOW_SIZE</span><span class="p">)</span>
<span class="c1"># 加载数据
</span> <span class="k">def</span> <span class="nf">load_table_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">table_data</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_ph</span><span class="p">.</span><span class="n">get_all</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">table_data</span><span class="p">.</span><span class="n">projects_in_tuple</span><span class="p">)):</span> <span class="c1"># 写入数据
</span> <span class="n">p</span> <span class="o">=</span> <span class="n">table_data</span><span class="p">.</span><span class="n">projects</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_insert_one_project</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">refresh_table</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">delete_all_table_data</span><span class="p">()</span>
<span class="bp">self</span><span class="p">.</span><span class="n">load_table_data</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_insert_one_project</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">p</span><span class="p">):</span>
<span class="k">if</span> <span class="n">p</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">"No project to insert."</span><span class="p">)</span>
<span class="k">return</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">''</span><span class="p">,</span> <span class="n">END</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
<span class="n">values</span><span class="o">=</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">code</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">manager</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">state</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="nb">id</span>
<span class="p">),</span> <span class="n">tags</span><span class="o">=</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">code</span><span class="p">))</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_cur_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># 根据列表条目选定情况,改变按钮状态
</span> <span class="k">def</span> <span class="nf">change_button_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">selected_list</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">selection</span><span class="p">()</span>
<span class="n">selected_item_num</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">selected_list</span><span class="p">)</span>
<span class="k">if</span> <span class="n">selected_item_num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_del_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">DISABLED</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_view_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">DISABLED</span>
<span class="k">elif</span> <span class="n">selected_item_num</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_view_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">NORMAL</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_del_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">NORMAL</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_view_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">DISABLED</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_del_pro_button</span><span class="p">[</span><span class="s">"state"</span><span class="p">]</span> <span class="o">=</span> <span class="n">NORMAL</span>
<span class="c1"># 加载表格
</span> <span class="k">def</span> <span class="nf">load_project_table</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># 创建table_frame
</span> <span class="n">table_frame</span> <span class="o">=</span> <span class="n">Frame</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pady</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="n">table_frame</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="n">BOTH</span><span class="p">)</span>
<span class="c1"># 创建滚动条
</span> <span class="n">table_scroll_y</span> <span class="o">=</span> <span class="n">Scrollbar</span><span class="p">(</span><span class="n">table_frame</span><span class="p">)</span>
<span class="n">table_scroll_y</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="n">RIGHT</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">Y</span><span class="p">)</span>
<span class="c1"># 创建表格
</span> <span class="n">table</span> <span class="o">=</span> <span class="n">ttk</span><span class="p">.</span><span class="n">Treeview</span><span class="p">(</span><span class="n">table_frame</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"code"</span><span class="p">,</span> <span class="s">"manager"</span><span class="p">,</span> <span class="s">"status"</span><span class="p">),</span> <span class="n">show</span><span class="o">=</span><span class="s">'headings'</span>
<span class="p">,</span> <span class="n">yscrollcommand</span><span class="o">=</span><span class="n">table_scroll_y</span><span class="p">.</span><span class="nb">set</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">25</span><span class="p">)</span>
<span class="c1"># 设置表格样式
</span> <span class="n">style</span> <span class="o">=</span> <span class="n">ttk</span><span class="p">.</span><span class="n">Style</span><span class="p">()</span>
<span class="n">style</span><span class="p">.</span><span class="n">theme_use</span><span class="p">(</span><span class="s">"default"</span><span class="p">)</span>
<span class="n">style</span><span class="p">.</span><span class="n">configure</span><span class="p">(</span><span class="s">"Treeview.Heading"</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="p">(</span><span class="s">'微软雅黑'</span><span class="p">,</span> <span class="mi">11</span><span class="p">))</span>
<span class="n">style</span><span class="p">.</span><span class="n">configure</span><span class="p">(</span><span class="s">"Treeview"</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="p">(</span><span class="s">'微软雅黑'</span><span class="p">,</span> <span class="mi">11</span><span class="p">),</span> <span class="n">rowheight</span><span class="o">=</span><span class="mi">25</span><span class="p">)</span>
<span class="c1"># 设置表格表头
</span> <span class="n">table</span><span class="p">.</span><span class="n">heading</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"项目名称"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">heading</span><span class="p">(</span><span class="s">"code"</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"项目编号"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">heading</span><span class="p">(</span><span class="s">"manager"</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"项目经理"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">heading</span><span class="p">(</span><span class="s">"status"</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"项目状态"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">column</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">450</span><span class="p">,</span> <span class="n">anchor</span><span class="o">=</span><span class="s">'center'</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">column</span><span class="p">(</span><span class="s">"code"</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">250</span><span class="p">,</span> <span class="n">anchor</span><span class="o">=</span><span class="s">'center'</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">column</span><span class="p">(</span><span class="s">"manager"</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">150</span><span class="p">,</span> <span class="n">anchor</span><span class="o">=</span><span class="s">'center'</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">column</span><span class="p">(</span><span class="s">"status"</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">150</span><span class="p">,</span> <span class="n">anchor</span><span class="o">=</span><span class="s">'center'</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">bind</span><span class="p">(</span><span class="s">"<<TreeviewSelect>>"</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">change_button_state</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">padx</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">BOTH</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span> <span class="o">=</span> <span class="n">table</span>
<span class="n">table_scroll_y</span><span class="p">.</span><span class="n">config</span><span class="p">(</span><span class="n">command</span><span class="o">=</span><span class="n">table</span><span class="p">.</span><span class="n">yview</span><span class="p">)</span>
<span class="c1"># 加载表格数据
</span> <span class="bp">self</span><span class="p">.</span><span class="n">load_table_data</span><span class="p">()</span>
<span class="c1"># 删除表格中所有数据
</span> <span class="k">def</span> <span class="nf">delete_all_table_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">get_children</span><span class="p">():</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_main_table</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="c1"># 加载菜单
</span> <span class="k">def</span> <span class="nf">load_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># 创建菜单Frame
</span> <span class="n">table_frame</span> <span class="o">=</span> <span class="n">Frame</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pady</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="n">table_frame</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="n">BOTH</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">"abc</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"abc</span><span class="se">\\</span><span class="s">n"</span><span class="p">.</span><span class="n">splitlines</span><span class="p">(</span><span class="bp">False</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"IN "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">tuple</span><span class="p">([</span><span class="s">"sd"</span><span class="p">])))</span>
</code></pre></div></div>onecoder很久没有更新博客了,有年底很忙的原因,也有在学习用Python瞎鼓捣点什么的因素,其实我并没有停止学习。 学了一段时间Python,本身有开发基础,总想着用Python鼓捣点什么我自己用的上的东西,所以从去年11月开始,就开始学习研究Python GUI编程,现在每天学学写写,走走停停,也算有所积累吧。 当然,还没什么见的人的成果,不过也可以考虑把阶段性代码更新上来,权当记录和一乐了。 2023年,祝自己好运,心想事成。Python练习-常用内建模块contextlib2022-11-04T14:20:24+00:002022-11-04T14:20:24+00:00http://www.coderli.com/python-module-contextlib<p>最近很忙,距离上一篇博文过去已经10多天了,不想荒废。今天继续学习Python常用内置模块contextlib。其实主要是学习了contextlib这个模块中@contextmanager这个注解的使用。</p>
<!--more-->
<p>前面学习过,在Python可以使用with语句自动的进行如文件处理时的打开和关闭操作。其实从原理上讲,在Python任何实现了__enter__和__exit__方法的类都可以使用with语句进行自动操作。例如:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 本部分练习contextlib 内置模块
</span>
<span class="k">class</span> <span class="nc">ContextDemo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">jobname</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Init"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Open"</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_val</span><span class="p">,</span> <span class="n">exc_tb</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Exit"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">dowork</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Do %s here."</span> <span class="o">%</span> <span class="bp">self</span><span class="p">.</span><span class="n">jobname</span><span class="p">)</span>
<span class="k">with</span> <span class="n">ContextDemo</span><span class="p">(</span><span class="s">"DemoJob"</span><span class="p">)</span> <span class="k">as</span> <span class="n">cd</span><span class="p">:</span>
<span class="n">cd</span><span class="p">.</span><span class="n">dowork</span><span class="p">()</span>
</code></pre></div></div>
<p>输出如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Init
Open
Do DemoJob here.
Exit
</code></pre></div></div>
<p>每次编写enter和exit会很犯错,可通过contextlib中的contextmanager注解快速实现同样的功能,如:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 写enter和exit仍然繁琐,通过contextlib有更简便的写法
</span><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
<span class="k">class</span> <span class="nc">ContextManagerDemo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">def</span> <span class="nf">dowork</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Do %s here....'</span> <span class="o">%</span> <span class="bp">self</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
<span class="o">@</span><span class="n">contextmanager</span>
<span class="k">def</span> <span class="nf">do_cmd_job</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Open'</span><span class="p">)</span>
<span class="n">q</span> <span class="o">=</span> <span class="n">ContextManagerDemo</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># 通过yield把q输出
</span> <span class="k">yield</span> <span class="n">q</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Exit'</span><span class="p">)</span>
<span class="k">with</span> <span class="n">do_cmd_job</span><span class="p">(</span><span class="s">"CMDemoJob"</span><span class="p">)</span> <span class="k">as</span> <span class="n">cmd</span><span class="p">:</span>
<span class="n">cmd</span><span class="p">.</span><span class="n">dowork</span><span class="p">()</span>
</code></pre></div></div>
<p>输入如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Open
Do CMDemoJob here....
Exit
</code></pre></div></div>
<p>这里contextmanager注解,有点像Java中的切片编程,可以讲真正要执行的函数“夹”在事前和事后处理中间。</p>
<p>如果一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用closing()来把该对象变为上下文对象。例如,用with语句使用urlopen(),这里其实closing也是利用contextmanager实现的,会默认调用传入对象的close方法,因此未实现close方法的类是无法使用closing函数的,会报错。这里通过源码可以看到urlopen对象是有close方法的。</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">closing</span>
<span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="n">urlopen</span>
<span class="k">with</span> <span class="n">closing</span><span class="p">(</span><span class="n">urlopen</span><span class="p">(</span><span class="s">"http://www.coderli.com"</span><span class="p">))</span> <span class="k">as</span> <span class="n">page</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">page</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</code></pre></div></div>
<p>输出如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Init
Do Closing here.
</code></pre></div></div>onecoder最近很忙,距离上一篇博文过去已经10多天了,不想荒废。今天继续学习Python常用内置模块contextlib。其实主要是学习了contextlib这个模块中@contextmanager这个注解的使用。Python练习-常用内建模块itertools2022-10-20T14:20:24+00:002022-10-20T14:20:24+00:00http://www.coderli.com/python-module-itertools<p>本部分学习Python常用内建模块itertools。itertools中提供了很多有用迭代器方法,用于生成和处理序列。直接通过代码学习</p>
<!--more-->
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 本部分学习Python内置的迭代器
</span><span class="kn">import</span> <span class="nn">itertools</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="nb">reduce</span>
<span class="c1"># 从6开始,依次加1计数,无限输出
</span><span class="n">counts</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
<span class="c1"># 利用takewhile截取
</span><span class="n">clist</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="n">takewhile</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o"><=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">counts</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">clist</span><span class="p">))</span>
<span class="c1"># 循环输出
</span><span class="n">cycles</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="n">cycle</span><span class="p">(</span><span class="s">"OneCoder"</span><span class="p">)</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">cycles</span><span class="p">:</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">></span> <span class="mi">15</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">print</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># 元素重复
</span><span class="n">repeats</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="n">repeat</span><span class="p">(</span><span class="s">"OneCoder"</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">repeats</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
<span class="c1"># chain 把一组迭代对象串联起来,形成一个更大的迭代器
</span><span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">itertools</span><span class="p">.</span><span class="n">chain</span><span class="p">(</span><span class="s">"Asdf"</span><span class="p">,</span> <span class="s">"Qwer"</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="c1"># groupby 集合相邻相同元素
</span><span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">group</span> <span class="ow">in</span> <span class="n">itertools</span><span class="p">.</span><span class="n">groupby</span><span class="p">(</span><span class="s">"AAABBcCDDD"</span><span class="p">,</span> <span class="k">lambda</span> <span class="nb">str</span><span class="p">:</span> <span class="nb">str</span><span class="p">.</span><span class="n">upper</span><span class="p">()):</span>
<span class="k">print</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">group</span><span class="p">))</span>
<span class="c1"># 练习 根据圆周率计算公式求pi:pi/4 = 1 - 1/3 + 1/5 - 1/7 ...
</span><span class="k">def</span> <span class="nf">pi</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
<span class="n">num_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">itertools</span><span class="p">.</span><span class="n">takewhile</span><span class="p">(</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o"><=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">N</span><span class="p">,</span> <span class="n">itertools</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)))</span>
<span class="n">flag</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="k">def</span> <span class="nf">map_f</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">nonlocal</span> <span class="n">flag</span>
<span class="n">flag</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span>
<span class="k">return</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">flag</span> <span class="o">/</span> <span class="n">x</span>
<span class="k">return</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="n">map_f</span><span class="p">,</span> <span class="n">num_list</span><span class="p">))</span>
<span class="c1"># 测试:
</span><span class="k">print</span><span class="p">(</span><span class="n">pi</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">pi</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">pi</span><span class="p">(</span><span class="mi">1000</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">pi</span><span class="p">(</span><span class="mi">10000</span><span class="p">))</span>
<span class="k">assert</span> <span class="mf">3.04</span> <span class="o"><</span> <span class="n">pi</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="o"><</span> <span class="mf">3.05</span>
<span class="k">assert</span> <span class="mf">3.13</span> <span class="o"><</span> <span class="n">pi</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="o"><</span> <span class="mf">3.14</span>
<span class="k">assert</span> <span class="mf">3.140</span> <span class="o"><</span> <span class="n">pi</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="o"><</span> <span class="mf">3.141</span>
<span class="k">assert</span> <span class="mf">3.1414</span> <span class="o"><</span> <span class="n">pi</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span> <span class="o"><</span> <span class="mf">3.1415</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>
<p>输出如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[6, 7, 8, 9, 10]
O
n
e
C
o
d
e
r
O
n
e
C
o
d
e
r
OneCoder
OneCoder
OneCoder
A
s
d
f
Q
w
e
r
A ['A', 'A', 'A']
B ['B', 'B']
C ['c', 'C']
D ['D', 'D', 'D']
3.0418396189294032
3.1315929035585537
3.140592653839794
3.1414926535900345
ok
</code></pre></div></div>onecoder本部分学习Python常用内建模块itertools。itertools中提供了很多有用迭代器方法,用于生成和处理序列。直接通过代码学习Python练习-常用内建模块hmac2022-10-11T14:00:24+00:002022-10-11T14:00:24+00:00http://www.coderli.com/python-module-hmac<p>本部分学习Python内置模块hmac。实际hmac是承接hashlib中的md5等摘要算法加salt的操作。对该操作进行了封装,使用起来更加通用方便。在学些了之前内容的基础上,本部分内容比较简单直接。直接看代码即可。
<!--more--></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># hmac 学习
</span><span class="n">message</span> <span class="o">=</span> <span class="sa">b</span><span class="s">"This is a python"</span>
<span class="n">key</span> <span class="o">=</span> <span class="sa">b</span><span class="s">" hashlib demo"</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">hmac</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">digestmod</span><span class="o">=</span><span class="s">'MD5'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">h</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">())</span>
<span class="c1">#练习 将上一节的salt改为标准的hmac算法,验证用户口令
# -*- coding: utf-8 -*-
</span><span class="kn">import</span> <span class="nn">hmac</span><span class="p">,</span> <span class="n">random</span>
<span class="k">def</span> <span class="nf">hmac_md5</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
<span class="k">return</span> <span class="n">hmac</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">),</span> <span class="n">s</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">),</span> <span class="s">'MD5'</span><span class="p">).</span><span class="n">hexdigest</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
<span class="bp">self</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">48</span><span class="p">,</span> <span class="mi">122</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)])</span>
<span class="bp">self</span><span class="p">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">hmac_md5</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">key</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="n">db</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">'michael'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">),</span>
<span class="s">'bob'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'abc999'</span><span class="p">),</span>
<span class="s">'alice'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'alice2008'</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="n">user</span> <span class="o">=</span> <span class="n">db</span><span class="p">[</span><span class="n">username</span><span class="p">]</span>
<span class="k">return</span> <span class="n">user</span><span class="p">.</span><span class="n">password</span> <span class="o">==</span> <span class="n">hmac_md5</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="n">key</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="c1"># 测试:
</span><span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'abc999'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'alice2008'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'1234567'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'Alice2008'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>
<p>唯一需要注意的是,在hmac.new中,传入的都是bytes。</p>onecoder本部分学习Python内置模块hmac。实际hmac是承接hashlib中的md5等摘要算法加salt的操作。对该操作进行了封装,使用起来更加通用方便。在学些了之前内容的基础上,本部分内容比较简单直接。直接看代码即可。Python练习-常用内建模块hashlib2022-10-07T13:40:24+00:002022-10-07T13:40:24+00:00http://www.coderli.com/python-module-hashlib<p>本部分学习Python常用内置模块hashlib。主要封装了md5、sha1等常用的摘要算法。摘要算法主要用来判断文本、代码等是否被修改,以及利用其不可逆性,用于在数据库中密文保存密码。
<!--more--></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Python中hashlib摘要算法类库
</span><span class="kn">import</span> <span class="nn">hashlib</span>
<span class="n">md5</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">md5</span><span class="p">()</span>
<span class="n">md5</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="s">'This is a python hashlib demo'</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">md5</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">())</span>
<span class="n">md5</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="s">'this is a python hashlib demo'</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">md5</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">())</span>
<span class="n">sha1</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">sha1</span><span class="p">()</span>
<span class="n">sha1</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="s">"This is a python "</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf8"</span><span class="p">))</span>
<span class="n">sha1</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="s">"hashlib demo"</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf8"</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">sha1</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">())</span>
</code></pre></div></div>
<p>输出如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>016109b4d87fb870e8cc61fd8075a15c
1acf688f896ee8944c8d1ae3d87f5e39
e820e61f70631375dbcf508a2a2910e9c02867e2
</code></pre></div></div>
<p>1个数据库密码密文存储和判断的小练习</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 练习 设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:
# -*- coding: utf-8 -*-
</span><span class="n">db</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">'michael'</span><span class="p">:</span> <span class="s">'e10adc3949ba59abbe56e057f20f883e'</span><span class="p">,</span>
<span class="s">'bob'</span><span class="p">:</span> <span class="s">'878ef96e86145580c38c87f0410ad153'</span><span class="p">,</span>
<span class="s">'alice'</span><span class="p">:</span> <span class="s">'99b1c2188db85afee403b1536010c2c9'</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="n">md5</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">md5</span><span class="p">()</span>
<span class="n">md5</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">password</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf8"</span><span class="p">))</span>
<span class="n">md5_pass</span> <span class="o">=</span> <span class="n">md5</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">()</span>
<span class="k">if</span> <span class="n">md5_pass</span> <span class="o">==</span> <span class="n">db</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">user</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="c1"># 测试:
</span><span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'abc999'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'alice2008'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'1234567'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'Alice2008'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>
<p>考虑到对于相同的密码,摘要后的值也相同,所以可以根据用户特征,进行“加盐”。如下练习</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 练习2,实现加salt的登录验证
# -*- coding: utf-8 -*-
</span><span class="kn">import</span> <span class="nn">hashlib</span><span class="p">,</span> <span class="n">random</span>
<span class="k">def</span> <span class="nf">get_md5</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">return</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">md5</span><span class="p">(</span><span class="n">s</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">)).</span><span class="n">hexdigest</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
<span class="bp">self</span><span class="p">.</span><span class="n">salt</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">username</span>
<span class="bp">self</span><span class="p">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">get_md5</span><span class="p">(</span><span class="n">password</span> <span class="o">+</span> <span class="bp">self</span><span class="p">.</span><span class="n">salt</span><span class="p">)</span>
<span class="n">db</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">'michael'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">),</span>
<span class="s">'bob'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'abc999'</span><span class="p">),</span>
<span class="s">'alice'</span><span class="p">:</span> <span class="n">User</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'alice2008'</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="n">user</span> <span class="o">=</span> <span class="n">db</span><span class="p">[</span><span class="n">username</span><span class="p">]</span>
<span class="k">return</span> <span class="n">user</span><span class="p">.</span><span class="n">password</span> <span class="o">==</span> <span class="n">get_md5</span><span class="p">(</span><span class="n">password</span> <span class="o">+</span> <span class="n">username</span><span class="p">)</span>
<span class="c1"># 测试:
</span><span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'abc999'</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'alice2008'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'michael'</span><span class="p">,</span> <span class="s">'1234567'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'bob'</span><span class="p">,</span> <span class="s">'123456'</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">login</span><span class="p">(</span><span class="s">'alice'</span><span class="p">,</span> <span class="s">'Alice2008'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>onecode本部分学习Python常用内置模块hashlib。主要封装了md5、sha1等常用的摘要算法。摘要算法主要用来判断文本、代码等是否被修改,以及利用其不可逆性,用于在数据库中密文保存密码。Python练习-常用内建模块struct2022-09-28T14:00:24+00:002022-09-28T14:00:24+00:00http://www.coderli.com/python-module-struct<p>本部分学习Python内置模块struct。struct模块可以方便快速的处理字节,如将一个整数转化为字节数组的表示等。</p>
<p>传统情况下,如果我们想将一个32位的整数,用1个由4个字节组成的字节数组表示的话,需编写如下代码:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">n</span> <span class="o">=</span> <span class="mi">12345678</span>
<span class="n">b1</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span> <span class="o">&</span> <span class="mh">0xff000000</span><span class="p">)</span> <span class="o">>></span> <span class="mi">24</span>
<span class="n">b2</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span> <span class="o">&</span> <span class="mh">0xff0000</span><span class="p">)</span> <span class="o">>></span> <span class="mi">16</span>
<span class="n">b3</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span> <span class="o">&</span> <span class="mh">0xff00</span><span class="p">)</span> <span class="o">>></span> <span class="mi">8</span>
<span class="n">b4</span> <span class="o">=</span> <span class="n">n</span> <span class="o">&</span> <span class="mh">0xff</span>
<span class="n">bs</span> <span class="o">=</span> <span class="nb">bytes</span><span class="p">([</span><span class="n">b1</span><span class="p">,</span> <span class="n">b2</span><span class="p">,</span> <span class="n">b3</span><span class="p">,</span> <span class="n">b4</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">b1</span><span class="p">,</span> <span class="n">b2</span><span class="p">,</span> <span class="n">b3</span><span class="p">,</span> <span class="n">b4</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">b1</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">b2</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">b3</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">b4</span><span class="p">))</span>
</code></pre></div></div>
<!--more-->
<p>输出</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0 188 97 78
0b0
0b10111100
0b1100001
0b1001110
</code></pre></div></div>
<p>而且上述代码仅针对整型有效,当涉及到浮点数转化的时候,就很困难了。通过struct模块,可以快速实现二进制数据类型和bytes转换,兼容整型、浮点型。</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">s_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="s">'>I'</span><span class="p">,</span> <span class="mi">12345678</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">s_bytes</span><span class="p">.</span><span class="nb">hex</span><span class="p">(</span><span class="s">'-'</span><span class="p">))</span>
<span class="n">s_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="p">.</span><span class="n">pack</span><span class="p">(</span><span class="s">'>f'</span><span class="p">,</span> <span class="mf">1234.5678</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">s_bytes</span><span class="p">.</span><span class="nb">hex</span><span class="p">(</span><span class="s">'-'</span><span class="p">))</span>
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">s_bytes</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</code></pre></div></div>
<p>输出</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>00-bc-61-4e
44-9a-52-2b
68
154
82
43
</code></pre></div></div>
<p>其中00-bc-61-4e和44-9a-52-2b是字节对应的十六进制表示,后四行是44-9a-52-2b对应的十进制表示。</p>
<p>从bytes数据还原代码如下</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">struct</span><span class="p">.</span><span class="n">unpack</span><span class="p">(</span><span class="s">'>f'</span><span class="p">,</span> <span class="n">s_bytes</span><span class="p">))</span>
</code></pre></div></div>
<p>这里的s_bytes,我们直接使用的是上面代码的输出结果,输出如下</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(1234.5677490234375,)
</code></pre></div></div>
<p>精度还是有丢失的。</p>
<p>最后做一个有趣的练习,</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>请编写一段代码,检查任意文件是否是位图文件,如果是,打印出图片大小和颜色数。
# BMP格式采用小端方式存储数据,文件头的结构按顺序如下:
# 两个字节:'BM'表示Windows位图,'BA'表示OS/2位图; 一个4字节整数:表示位图大小; 一个4字节整数:保留位,始终为0;
# 一个4字节整数:实际图像的偏移量; 一个4字节整数:Header的字节数; 一个4字节整数:图像宽度;
# 一个4字节整数:图像高度; 一个2字节整数:始终为1; 一个2字节整数:颜色数。
</code></pre></div></div>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">base64</span><span class="p">,</span> <span class="n">struct</span>
<span class="n">bmp_data</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="s">'Qk1oAgAAAAAAADYAAAAoAAAAHAAAAAoAAAABABAAAAAAADICAAASCwAAEgsAA'</span> <span class="o">+</span>
<span class="s">'AAAAAAAAAAA/3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3/'</span> <span class="o">+</span>
<span class="s">'/f/9//3//f/9//3//f/9/AHwAfAB8AHwAfAB8AHwAfP9//3//fwB8AHwAfAB8/3//f/9/A'</span> <span class="o">+</span>
<span class="s">'HwAfAB8AHz/f/9//3//f/9//38AfAB8AHwAfAB8AHwAfAB8AHz/f/9//38AfAB8/3//f/9'</span> <span class="o">+</span>
<span class="s">'//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9//3//fwB8AHz/f'</span> <span class="o">+</span>
<span class="s">'/9//3//f/9/AHwAfP9//3//f/9//3//f/9//38AfAB8AHwAfAB8AHwAfP9//3//f/9/AHw'</span> <span class="o">+</span>
<span class="s">'AfP9//3//f/9//38AfAB8/3//f/9//3//f/9//3//fwB8AHwAfAB8AHwAfAB8/3//f/9//'</span> <span class="o">+</span>
<span class="s">'38AfAB8/3//f/9//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9'</span> <span class="o">+</span>
<span class="s">'//3//fwB8AHz/f/9/AHz/f/9/AHwAfP9//38AfP9//3//f/9/AHwAfAB8AHwAfAB8AHwAf'</span> <span class="o">+</span>
<span class="s">'AB8/3//f/9/AHwAfP9//38AfAB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8AHwAfAB8AHw'</span> <span class="o">+</span>
<span class="s">'AfAB8/3//f/9/AHwAfAB8AHz/fwB8AHwAfAB8AHwAfAB8AHz/f/9//3//f/9//3//f/9//'</span> <span class="o">+</span>
<span class="s">'3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//38AAA=='</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">bmp_info</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">bmp_info_tuple</span> <span class="o">=</span> <span class="n">struct</span><span class="p">.</span><span class="n">unpack</span><span class="p">(</span><span class="s">'<ccIIIIIIHH'</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">30</span><span class="p">])</span>
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">bmp_info_tuple</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s">'width'</span><span class="p">:</span> <span class="n">bmp_info_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">4</span><span class="p">],</span>
<span class="s">'height'</span><span class="p">:</span> <span class="n">bmp_info_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">3</span><span class="p">],</span>
<span class="s">'color'</span><span class="p">:</span> <span class="n">bmp_info_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="p">}</span>
<span class="c1"># 测试
</span><span class="n">bi</span> <span class="o">=</span> <span class="n">bmp_info</span><span class="p">(</span><span class="n">bmp_data</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">bi</span><span class="p">[</span><span class="s">'width'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">28</span>
<span class="k">assert</span> <span class="n">bi</span><span class="p">[</span><span class="s">'height'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">10</span>
<span class="k">assert</span> <span class="n">bi</span><span class="p">[</span><span class="s">'color'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">16</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>onecode本部分学习Python内置模块struct。struct模块可以方便快速的处理字节,如将一个整数转化为字节数组的表示等。 传统情况下,如果我们想将一个32位的整数,用1个由4个字节组成的字节数组表示的话,需编写如下代码: n = 12345678 b1 = (n & 0xff000000) >> 24 b2 = (n & 0xff0000) >> 16 b3 = (n & 0xff00) >> 8 b4 = n & 0xff bs = bytes([b1, b2, b3, b4]) print(b1, b2, b3, b4) print(bin(b1)) print(bin(b2)) print(bin(b3)) print(bin(b4))Python练习-常用内建模块base642022-09-18T14:00:24+00:002022-09-18T14:00:24+00:00http://www.coderli.com/python-module-base64<p>本部分学习Python中关于base64编码的基本操作。关于这部分内容,除了基本的base64操作外,我还查阅了一些资料,了解了base64的一些基础常识,比如:base64是因为什么出现的?编码规则等。我觉得了解了事务的背景,对于理解、掌握和应用该技术,是非常必要和有帮助的。</p>
<!--more-->
<h1 id="一base64编码为什么出现">一、base64编码为什么出现</h1>
<p>一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x7F);而超过 ASCII 范围的 128~255(十六进制:0x80 ~ 0xFF)之间的值是不可见字符。</p>
<p>当不可见字符在网络上传输时,比如说从 A 计算机传到 B 计算机,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。为了解决这个问题,人们利用一种编码规则,将不可见字符变为可见字符,以确保数据在在网络上可靠传输。当然这个过程是可逆的,这就是base64编码的初衷。
Base64 的内容由 0 ~ 9,a ~ z,A ~ Z,+,/ 组成,正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。</p>
<h1 id="二base64编码规则">二、base64编码规则</h1>
<p>前面介绍了,Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 2⁶ = 64 ,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节有 24 个比特,对应于 4 个 base64 单元,即 3 个字节可由 4 个可打印字符来表示,也就是说经过base64编码后,数据体积膨胀了约33%。如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
<img src="/images/post/20220918-python-base64-rule.png" alt="base64编码规则" />
base64 常用于在处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 的电子邮件及 XML的一些复杂数据。也可以用来将图片进行编码,以文本方式进行传输,并还原。</p>
<h1 id="三python的base64编码操作">三、Python的base64编码操作</h1>
<p>Python内置的base64可以直接进行base64的编解码</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">b_code</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64encode</span><span class="p">(</span><span class="sa">b</span><span class="s">'Man'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">b_code</span><span class="p">)</span>
</code></pre></div></div>
<p>输出:</p>
<blockquote>
<p>b’TWFu’</p>
</blockquote>
<p>可见原来3个字节的Man字符,编码后,变成了4个字节,TWFu</p>
<p>如果是b”Girl”四个字母的话,每个字母1个字节,8个bit可以表示。4 * 8 = 32,不能被6bit正除,需要补两个字节16个bit,变成48个bit,及转换后5个字符,两个=号,验证如下:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">b_code</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64encode</span><span class="p">(</span><span class="sa">b</span><span class="s">'Girl'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">b_code</span><span class="p">)</span>
</code></pre></div></div>
<p>输出:</p>
<blockquote>
<p>b’R2lybA==’</p>
</blockquote>
<p>由于URL中不方便使用+和/,因此有一种URL safe的编码方式,即把+和/变成-和_</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64encode</span><span class="p">(</span><span class="sa">b</span><span class="s">'i</span><span class="se">\xb7\x1d\xfb\xef\xff</span><span class="s">'</span><span class="p">))</span>
</code></pre></div></div>
<p>输出</p>
<blockquote>
<p>b’abcd++//’<br />
b’abcd–__’</p>
</blockquote>
<p>由于=号也有可能在Cookie,URL中造成歧义,因此也有的base64编码将=号去掉。因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。</p>
<p>最后做个小练习</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 练习 请写一个能处理去掉=的base64解码函数:
</span><span class="k">def</span> <span class="nf">safe_base64_decode</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="n">l_s</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">need_to_add_num</span> <span class="o">=</span> <span class="n">l_s</span> <span class="o">%</span> <span class="mi">4</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">need_to_add_num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="s">"="</span> <span class="o">*</span> <span class="n">need_to_add_num</span>
<span class="k">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="c1"># 测试:
</span><span class="k">assert</span> <span class="sa">b</span><span class="s">'abcd'</span> <span class="o">==</span> <span class="n">safe_base64_decode</span><span class="p">(</span><span class="s">'YWJjZA=='</span><span class="p">)</span>
<span class="k">assert</span> <span class="sa">b</span><span class="s">'abcd'</span> <span class="o">==</span> <span class="n">safe_base64_decode</span><span class="p">(</span><span class="s">'YWJjZA'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'ok'</span><span class="p">)</span>
</code></pre></div></div>
<p>参考文献:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Base64#Implementations_and_history">https://en.wikipedia.org/wiki/Base64#Implementations_and_history</a></li>
<li><a href="https://cloud.tencent.com/developer/article/1583540">https://cloud.tencent.com/developer/article/1583540</a></li>
<li><a href="https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184">https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184</a></li>
</ul>onecode本部分学习Python中关于base64编码的基本操作。关于这部分内容,除了基本的base64操作外,我还查阅了一些资料,了解了base64的一些基础常识,比如:base64是因为什么出现的?编码规则等。我觉得了解了事务的背景,对于理解、掌握和应用该技术,是非常必要和有帮助的。期货业务学习-大商所客户移仓业务2022-09-15T01:10:24+00:002022-09-15T01:10:24+00:00http://www.coderli.com/futures-study-move%20position<p>大商所自7月29日起开展客户移仓业务,填补了国内在该业务领域的空白,为具有在不同会员间转移持仓需求的客户提供了便利。
<!--more--></p>
<h1 id="一什么是移仓业务">一、什么是移仓业务</h1>
<p><strong>移仓是指同一交易者将其持仓在不同会员间进行转移,或在同意会员下的不同账户间进行转移。</strong></p>
<p>该业务在境外已较为成熟,在境内大商所首推。</p>
<h1 id="二为什么要有移仓业务">二、为什么要有移仓业务</h1>
<h2 id="一填补境内业务空缺">(一)填补境内业务空缺</h2>
<p>以前仅支持会员或境外中介机构整体持仓转移(经纪会员因故不能从事期货经纪业务或发生合并、分立、破产时,由经纪会员和客户提出申请,经交易所批准,可进行客户移仓。),不支持客户级别。</p>
<h2 id="二满足市场需求">(二)满足市场需求</h2>
<p>期货市场普遍存在对于客户层级开展移仓业务需求。</p>
<ul>
<li>(1)持仓分散在数家会员的客户,在交割月前可将有交割单位整数倍要求的合约持仓进行凑整,避免在流动性较差的合约上发生违约。(比如:铁矿石合约100手起可以交割,若客户在不同会员有分散持仓,且均不足100手,则可以通过移仓,整合持仓,达到100手的交割要求。)</li>
<li>(2)实控账户组通常选择交割成本低、交割便利或具有交割资质的组内客户进行交割,在交割月将所有持仓转移至组内某一个或几个客户持有。</li>
</ul>
<p>交易所根据客户需要实施移仓,从而提升客户的资金使用效率和整体运营效率。</p>
<h1 id="三谁可以参与">三、谁可以参与</h1>
<p>主要分两类群体:
(1)不同期货公司会员或境外特殊经纪参与者下的同一客户。
(2)同一实控账户内的单位客户、非期货公司会员、境外特殊非经济参与者。(即非个人客户)</p>
<blockquote>
<ul>
<li>非期货公司会员、境外特殊非经纪参与者仅能移出,不能移入。(即:可将持仓移入普通会员客户账户下)</li>
<li>实控账户组内个人客户不支持移仓</li>
</ul>
</blockquote>
<h1 id="四业务流程">四、业务流程</h1>
<h2 id="一申请时间">(一)申请时间</h2>
<p>合约上市之日起到最后一个交易日的前1个交易日的闭式前,可向交易所申请。</p>
<h2 id="二申请流程">(二)申请流程</h2>
<h3 id="1-提出申请">1. 提出申请</h3>
<p>会员代客户提交申请;<br />
非期货公司会员自行申请;<br />
境外特殊非经纪参与者通过委托结算的期货公司会员提出申请。</p>
<h3 id="2-移入会员确认">2. 移入会员确认</h3>
<p>确认后,提交到交易所</p>
<h3 id="3-交易所审批">3. 交易所审批</h3>
<p>收到申请,当日审批。审批后,当日闭市后完成移仓。</p>
<h1 id="五其他事项">五、其他事项</h1>
<ul>
<li>手续费暂免</li>
<li>同一客户,可移仓持仓和保证金;同一实控组仅可进行持仓移仓。</li>
</ul>onecode大商所自7月29日起开展客户移仓业务,填补了国内在该业务领域的空白,为具有在不同会员间转移持仓需求的客户提供了便利。Python练习-常用内建模块collections2022-09-14T14:30:24+00:002022-09-14T14:30:24+00:00http://www.coderli.com/python-module-collections<p>本部分学习Python常用内建模块collections。collections模块中提供了很多集合相关的类,如namedtuple、OrderDict、ChainMap以及Count等。便于针对特定使用场景,高效的进行集合操作。</p>
<h1 id="一namedtuple">一、namedtuple</h1>
<p>namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来使用tuple的某个元素。主要的作用是增强了使用tuple时的可读性</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
</span><span class="n">Boys</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s">"Boy"</span><span class="p">,</span> <span class="p">[</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"age"</span><span class="p">])</span>
<span class="n">boy_one</span> <span class="o">=</span> <span class="n">Boys</span><span class="p">(</span><span class="s">"One"</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">boy_one</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">boy_one</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">boy_one</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">))</span>
</code></pre></div></div>
<!--more-->
<p>输出如下:</p>
<blockquote>
<p>Boy(name=’One’, age=20)<br />
One<br />
True</p>
</blockquote>
<h1 id="二deque">二、deque</h1>
<p>deque是一个双向列表,可以高效实现插入和删除操作</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dq</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="s">'a'</span><span class="p">,</span> <span class="s">'b'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">])</span>
<span class="n">dq</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">"zz"</span><span class="p">)</span>
<span class="n">dq</span><span class="p">.</span><span class="n">appendleft</span><span class="p">(</span><span class="s">"XX"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
<span class="n">dq</span><span class="p">.</span><span class="n">popleft</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">dq</span><span class="p">)</span>
</code></pre></div></div>
<p>输出如下:</p>
<blockquote>
<p>deque([‘XX’, ‘a’, ‘b’, ‘c’, ‘zz’])<br />
deque([‘a’, ‘b’, ‘c’, ‘zz’])</p>
</blockquote>
<h1 id="三defualdict">三、defualdict</h1>
<p>defualdict是一个当key不存在返回默认值的dict</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dd</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="s">"Key does not exist"</span><span class="p">)</span>
<span class="n">dd</span><span class="p">[</span><span class="s">"k1"</span><span class="p">]</span> <span class="o">=</span> <span class="s">"val1"</span>
<span class="k">print</span><span class="p">(</span><span class="n">dd</span><span class="p">[</span><span class="s">"k1"</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">dd</span><span class="p">[</span><span class="s">"k2"</span><span class="p">])</span>
</code></pre></div></div>
<p>输出如下:</p>
<blockquote>
<p>val1<br />
Key does not exist</p>
</blockquote>
<h1 id="四ordereddict">四、OrderedDict</h1>
<p>OrderedDict是key按照插入顺序的dict</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">od</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
<span class="n">od</span><span class="p">[</span><span class="s">"a"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">od</span><span class="p">[</span><span class="s">"c"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">od</span><span class="p">[</span><span class="s">"b"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">print</span><span class="p">(</span><span class="n">od</span><span class="p">.</span><span class="n">keys</span><span class="p">())</span>
</code></pre></div></div>
<p>输出如下:</p>
<blockquote>
<p>odict_keys([‘a’, ‘c’, ‘b’])</p>
</blockquote>
<h1 id="五chainmap">五、ChainMap</h1>
<p>ChainMap可以把一组dict串起来并组成一个逻辑上的dict。ChainMap本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。适合于例如:多处设置同一变量值,存在变量值覆盖,但是有取值优先级的场景。</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dict_one</span> <span class="o">=</span> <span class="p">{</span><span class="s">"A"</span><span class="p">:</span> <span class="s">"AOne"</span><span class="p">}</span>
<span class="n">dict_two</span> <span class="o">=</span> <span class="p">{</span><span class="s">"A"</span><span class="p">:</span> <span class="s">"BOne"</span><span class="p">,</span> <span class="s">"B"</span><span class="p">:</span> <span class="s">"Two"</span><span class="p">}</span>
<span class="n">dic_three</span> <span class="o">=</span> <span class="p">{</span><span class="s">"C"</span><span class="p">:</span> <span class="s">"CThree"</span><span class="p">}</span>
<span class="n">cm</span> <span class="o">=</span> <span class="n">ChainMap</span><span class="p">(</span><span class="n">dict_one</span><span class="p">,</span> <span class="n">dict_two</span><span class="p">,</span> <span class="n">dic_three</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">cm</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"A"</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">cm</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"B"</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">cm</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"C"</span><span class="p">))</span>
</code></pre></div></div>
<p>输出如下:</p>
<blockquote>
<p>AOne<br />
Two<br />
CThree</p>
</blockquote>
<h1 id="六counter">六、Counter</h1>
<p>Counter计数器用于统计字符出现的次数</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">c</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="s">"Javajavascriptpython"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</code></pre></div></div>
<p>输出如下:</p>
<blockquote>
<p>Counter({‘a’: 4, ‘v’: 2, ‘p’: 2, ‘t’: 2, ‘J’: 1, ‘j’: 1, ‘s’: 1, ‘c’: 1, ‘r’: 1, ‘i’: 1, ‘y’: 1, ‘h’: 1, ‘o’: 1, ‘n’: 1})</p>
</blockquote>onecode本部分学习Python常用内建模块collections。collections模块中提供了很多集合相关的类,如namedtuple、OrderDict、ChainMap以及Count等。便于针对特定使用场景,高效的进行集合操作。 一、namedtuple namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来使用tuple的某个元素。主要的作用是增强了使用tuple时的可读性 # namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。 Boys = namedtuple("Boy", ["name", "age"]) boy_one = Boys("One", 20) print(boy_one) print(boy_one.name) print(isinstance(boy_one, tuple))