ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python 基础文件 I/O 实战:用 Advanced Python Mastery 练习 1.3 编写 pcost.py 计算股票投资组合成本

2026/10/4 11:50:16 拓冰建站 浏览量
Python 基础文件 I/O 实战:用 Advanced Python Mastery 练习 1.3 编写 pcost.py 计算股票投资组合成本 示例工程教程【免费下载链接】python-masteryAdvanced Python Mastery (course by dabeaz)项目地址https://gitcode.com/gh_mirrors/py/python-mastery点击查看免费下载导读本篇围绕 David Beazley 的 Advanced Python Mastery 课程 练习 1.3 展开带你从零编写一个名为pcost.py的小程序读取课程自带的 Data/portfolio.dat 数据文件逐行解析每只股票的持股数量与买入单价最终计算出整个投资组合的总成本。读完本文你将掌握 Python 文件打开与读取、with上下文管理、逐行迭代、字符串split()切分以及int/float类型转换这一整套基础 I/O 编程套路并能够把同样的模式迁移到其他文本格式的数据处理任务中。练习定位Python Review 阶段的第一道文件处理题在课程结构中练习 1.3 属于 1. Python Review 章节是 练习索引 中排在基础语法复习练习 1.1、1.2之后的第一道涉及文件输入输出的题目。它的目标非常明确——回顾基本文件 I/OReview basic file I/O。课程假设学习者已经具备一定的 Python 基础参见 README.md 的前置条件说明因此这道练习用最小规模的代码把文件操作中最核心的几个知识点串起来用open()打开文件并读取内容用with语句确保文件被正确关闭把文件对象当作可迭代对象用for line in f逐行处理用str.split()把一行文本切分成字段用int()、float()把字符串转换为数值并累加。练习完成后生成的文件是pcost.py该文件在后续练习中还会被反复改造重构为函数、添加异常处理等因此它实际上是整门课程早期的一条主线代码。数据文件格式理解 portfolio.dat 的列结构练习使用的输入数据位于 Data/portfolio.dat文件内容为 7 行空格分隔的文本AA 100 32.20 IBM 50 91.10 CAT 150 83.44 MSFT 200 51.23 GE 95 40.37 MSFT 50 65.10 IBM 100 70.44每一行代表一次股票买入记录共三列列含义示例第 1 列股票代码stock nameAA、IBM第 2 列持股数量number of shares100、50第 3 列每股买入价purchase price of a single share32.20、91.10注意两个细节同一只股票可能出现在多行如MSFT和IBM各出现两次因此不能按股票代码去重而是要对每一行单独累加第二列是整数股数第三列是浮点数价格解析时必须分别使用int()和float()转换。计算总成本的方法在练习中写得很直白求第二列乘以第三列的累加和即total_cost Σ (shares × price)。需求拆解一个读文件 算总和的最小流水线练习 1.3 的任务可以拆成以下四步打开文件读取Data/portfolio.dat的全部内容逐行读取文件对象天然支持迭代for line in f每次取出一行含末尾换行符\n解析字段用line.split()按空白把一行切成字符串列表例如AA 100 32.20\n→[AA, 100, 32.20]转换并累加nshares int(fields[1])、price float(fields[2])然后total_cost nshares * price。最终打印总成本即可。逐步实现 pcost.py下面按照课程练习要求一步步写出pcost.py。第一步打开文件并逐行迭代Python 打开文件的标准写法是open()配合with语句。with会在代码块结束时自动关闭文件即使中途抛出异常也能保证资源释放这是课程推荐并一直沿用的最佳实践with open(Data/portfolio.dat, r) as f: for line in f: print(line) # 先看看每一行的原始内容这里的第二个参数r表示只读模式read也是open()的默认模式因此可以省略不写。文件对象f是一个可迭代对象for line in f会按行产出内容无需一次性把整个文件读入内存——这种逐行处理方式对大数据文件尤其友好。第二步解析每一行对当前行调用split()默认按任意连续的空白字符空格、制表符等切分返回字段列表fields line.split() # AA 100 32.20\n - [AA, 100, 32.20]随后从列表中取出对应位置的数据并完成类型转换nshares int(fields[1]) # 字符串 100 - 整数 100 price float(fields[2]) # 字符串 32.20 - 浮点数 32.2第三步累加并输出把每一行的shares × price累加到total_cost变量中total_cost 0.0 ... total_cost total_cost nshares * price完整代码结合课程官方解答 soln1_3.md 与仓库中可直接运行的实现 Solutions/1_3/pcost.py完整的pcost.py如下# pcost.py total_cost 0.0 with open(Data/portfolio.dat, r) as f: for line in f: fields line.split() nshares int(fields[1]) price float(fields[2]) total_cost total_cost nshares * price print(total_cost)注意仓库内的 Solutions/1_3/pcost.py 由于位于Solutions/1_3/子目录其文件路径写作../../Data/portfolio.dat而当你把pcost.py放在仓库根目录课程 README.md 假设所有练习工作在顶层python-mastery目录中进行时应使用Data/portfolio.dat这一相对路径。运行与验证在仓库根目录执行bash % python3 pcost.py正确输出应为44671.15该数值与后续 练习 1.4 中交互式调用函数的验证结果完全一致portfolio_cost(Data/portfolio.dat)返回44671.15可以用于交叉校验你的实现是否正确。如果希望手动核算可以验证其中部分行AA 100 × 32.20 3220.0IBM 50 × 91.10 4555.0全部 7 行累加之和即为44671.15。关键知识点深挖1. 为什么for line in f而不是f.read()后再 split文件对象本身是迭代器for line in f按需逐行读取内存占用恒定而f.read()会把整个文件一次性读入内存再手动split(\n)。对于本练习这种小文件两者皆可但从源码习惯和后续大数据处理的角度课程给出的逐行迭代写法是更通用、更省内存的模式也是后面练习如 练习 2.1 中的readrides.py、练习 8.x 的实时日志跟随一直沿用for line in f的原因。2. 换行符去哪了for line in f取出的每一行包含末尾的\n。在本练习中line.split()会忽略换行符等空白字符因此无需手动strip()但如果后续用fields[0]直接比较字符串或拼接输出就要留意换行符的存在。练习 1.4 的报错示例Couldnt parse: C - 53.08\n中就可以看到repr(line)输出的换行符这正是对原始行内容的直观展示。3. 类型转换的边界遇到坏数据会怎样int()和float()在无法转换时会抛出ValueError。例如 Data/portfolio3.dat 中混入了C - 53.08这类第二列为-的坏行直接转换会崩溃。这一崩溃点正是 练习 1.4 的主题把pcost.py重构为函数portfolio_cost(filename)并用try/except ValueError捕获坏行、打印警告后继续处理。仓库中的演进版本 Solutions/1_4/pcost.py 展示了这一改造的完整代码可作为从脚本走向健壮程序的过渡参考。进阶延伸从脚本到可复用函数虽然练习 1.3 只要求写出可运行的脚本但紧接着的 练习 1.4 会要求你把它改造成带参函数def portfolio_cost(filename): total_cost 0.0 with open(filename) as f: for line in f: fields line.split() nshares int(fields[1]) price float(fields[2]) total_cost total_cost nshares * price return total_cost print(portfolio_cost(Data/portfolio.dat))改造后的函数可以直接在交互解释器中调用例如用python3 -i pcost.py进入交互模式后执行 portfolio_cost(Data/portfolio.dat) 44671.15 portfolio_cost(Data/portfolio2.dat) 19908.75其中 Data/portfolio2.dat 是另一份四行记录的测试数据AA 50 27.10、HPQ 250 43.15、MSFT 25 50.15、GE 125 52.10可作为函数正确性的第二个验证样例。仓库中的可参考资源练习原文Exercises/ex1_3.md官方解答Exercises/soln1_3.md可运行实现Solutions/1_3/pcost.py练习输入数据Data/portfolio.dat、Data/portfolio2.dat、Data/portfolio3.dat含坏数据供练习 1.4 使用后续演进Solutions/1_4/pcost.py函数化 异常处理、Exercises/ex1_4.md课程总览README.md、PythonMastery.pdf配套讲义小结练习 1.3 用 10 行左右的代码完整覆盖了 Python 文件 I/O 的最小闭环open→ 逐行迭代 →split切分 → 数值转换 → 累加求和。这不仅是本课程所有数据处理类练习后续的 CSV 读取、实时日志跟踪等的基础也是日常脚本开发中使用频率最高的核心模式。建议亲手在仓库根目录写下pcost.py并跑通44671.15这个结果再按 练习 1.4 的要求把它演进为带异常处理的函数完成从能跑到健壮的第一次升级。赞分享示例工程教程【免费下载链接】python-masteryAdvanced Python Mastery (course by dabeaz)项目地址https://gitcode.com/gh_mirrors/py/python-mastery点击查看免费下载相关推荐5步构建Python股票数据分析平台从入门到实战的完整指南 5步构建Python股票数据分析平台从入门到实战的完整指南 想要掌握Python高级编程技巧通过构建一个 股票数据分析平台 你不仅能学习Python示例工程教程Practical Python投资分析工具pcost.py计算秘籍Practical Python投资分析工具pcost.py计算秘籍 想要掌握Python投资分析的核心技能吗 pcost.py作为Practical教程文档7个Python算法优化技巧从O(n²)到O(n log n)的性能蜕变7个Python算法优化技巧从O n² 到O n log n 的性能蜕变 在Python编程中算法效率往往决定了程序的性能上限。 GitHub 加速计划 /示例工程教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考