十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零基础学Python文件处理:从Hello World到实战脚本

零基础学Python文件处理:从Hello World到实战脚本 作为一个写了十几年Python、常年带零基础新人入门的开发者我太清楚这条路上的坎了。很多人卡住不是因为笨而是因为教程要么只讲语法不讲怎么用要么直接扔一堆高深框架让人劝退。这篇教程就是来解决这个问题的——从你敲下第一行Hello World开始一路走到能真正读写文件、处理手头数据全程用大白话加上能直接跑的代码把这条最经典的学习路径走通。无论你是刚毕业的学生、转行的职场人还是想用Python偷懒的办公族这篇文章都适合你照着敲敲完你就能自己动手处理一些杂活了。为什么把“文件处理”当作零基础入门的第一道关因为如果你的代码只能print那它永远活在黑色终端里碰不到真实世界。真实世界的数据在Excel表里、在日志文件里、在货运单据里、在分析报告里。只有当你学会了让Python去读文件、改文件、生成文件这门语言才算真正开始为你干活。而且说实话文件处理涉及的路径、编码、异常这些知识点正是区分“会抄代码”和“真懂Python”的分水岭。废话不多说开干。1. 环境搭建别让工具本身劝退你1.1 Python安装与版本选择的坑先说明一个很多初学者忽略的问题到底下载哪个Python版本去 python.org 官网下载区最新稳定版现在基本是3.12或3.13系列。别犹豫直接上最新稳定版就对了。有些老教程建议装3.8、3.9那多半是他们的项目有历史包袱跟你一个纯新手没关系。新版语法更干净报错信息更友好第三方库兼容性也早就跟上了。安装时有一个动作至关重要勾选“Add Python to PATH”。这一步不做你后面在终端里输python就会提示找不到命令。PATH是什么可以暂时不深究把它想象成系统的一个通讯录你勾选了系统才知道去哪里找Python。还要注意Windows用户如果之前装过来自Microsoft Store的Python版本建议先卸载掉否则命令行容易反应过来一个版本很老、功能不全的Python后面装包会踩不少坑。安装完成后打开终端Windows是cmd或PowerShellmacOS是Terminal输入python --version如果输出了类似Python 3.12.4这样的字样环境就算通了。什么你说没输出那就看你是不是漏了勾PATH或者安装完没重新打开终端。这种小问题几乎人人都会碰到不用慌重新跑一遍安装程序选择Modify把PATH勾上重启终端就好了。1.2 编辑器选择VSCode搞定Python开发编辑器我推荐VSCode免费、轻量、插件生态好而且配置Python环境非常简单远没有网上传的那么复杂。流程是先去 code.visualstudio.com 下载安装VSCode然后打开左侧扩展面板搜索“Python”安装微软官方那个插件发布者是Microsoft图标是蓝底蟒蛇。装完插件后CtrlShiftP打开命令面板输入Python: Select Interpreter选择你刚装好的Python版本。这里要注意VSCode本质是一个文本编辑器它不内置Python所以必须告诉它“用哪个Python来解释和运行我的代码”这就是选择解释器的意义。选好之后打开一个.py文件点右上角的三角形运行按钮就能直接在“终端”面板看到输出结果。还有一个提升效率的小设置把VSCode的终端默认改成PowerShell或cmd都行重要的是你要习惯在终端里手动敲一句python 文件.py来运行脚本因为很多实际场景里编辑器的一键运行并不够用。2. 第一个Python脚本Hello World与变量2.1 从Hello World到交互式环境新建一个文件夹比如learn_python在里面创建一个文件hello.py用VSCode打开敲入print(Hello World)然后在终端里运行python hello.py看到Hello World输出恭喜你你已经走完了所有程序员都要走的第一步。这一步的意义不是这句英文本身而是你确认了自己的电脑能执行Python代码工具链全通了。接下来如果你在终端里直接输入python不带任何参数会进入一个叫“交互式解释器”的环境提示符是。你可以在这里一行一行地敲代码立刻看到结果。比如敲print(1 2)回车马上输出3。这个交互式环境是个宝贝我到现在还经常用它来做实验。遇到不确定的语法开个交互式窗口试一下比翻文档快得多。exit()退出交互式环境回到普通终端。2.2 变量、赋值与类型转换变量在Python里非常直观你想叫它什么就叫什么赋值就是变量名 值。name 李明 age 25 height 1.78 is_student False不用声明类型Python自己会通过右边的值判断类型这就是“动态类型”。但对于初学者我建议你养成用type()函数查验类型的习惯print(type(name)) # class str print(type(age)) # class int print(type(height)) # class float print(type(is_student)) # class bool这里必须强调一个很多零基础同学踩过的坑age 25会报错。整数和字符串不能直接相加必须要做“类型转换”。转换的语法很简单total str(age) 岁 # 整数转字符串 price float(19.9) # 字符串转浮点数 num int(42) # 字符串转整数这就对应了一个常见的练习场景用户输入什么获取到的都是字符串但你想做数学计算怎么办答案是int()或float()转一下。记住这个思路后面文件处理里读出来的数据全是字符串要做数值统计就必须先转换。可以这么说不会类型转换文件处理寸步难行。3. Python核心语法从基础到写得出逻辑3.1 条件、循环与代码块Python用缩进表示代码块这是它在语法上最容易让新手适应也最容易让新手抓狂的地方。规则其实一句话同一层级的代码缩进必须一致。官方推荐4个空格别用Tab键混着来。条件判断的写法是score 75 if score 90: print(优秀) elif score 60: print(及格) else: print(需要努力)循环最常用的是for配合range()生成一系列数字for i in range(5): print(i) # 0 1 2 3 4while循环适合不知道什么时候停的情况比如让用户输入直到输入正确password while password ! 123456: password input(请输入密码: ) print(密码正确)这里分享一个我的实操习惯拿“李白打酒”这类趣味题来练手非常合适。题目大概是“李白街上走提壶去买酒遇店加一倍见花喝一斗三遇店和花喝光壶中酒试问壶中原有多少酒”。逆向推理用循环和变量就能算出来。这种古典数学题不但练循环还练“倒推”的算法思维比枯燥打印数字有意思得多。3.2 字符串的常用操作文件处理离不开字符串操作。Python的字符串功能极强这里列几个最常用的line hello, world print(line.strip()) # 去掉首尾空格结果为hello, world print(line.split(,)) # 按逗号拆分结果为[ hello, world ] print(line.replace(world, python)) # 替换 print(len(line)) # 长度包括空格 print(line.lower()) # 转小写这些方法我一个一个解释一下场景strip()用于清理从文件读出来的行自带的换行符和多余空格split()用于解析CSV日志等用分隔符组织的数据replace()做文本替换len()数每行长度lower()统一大小写便于比较。再强调一个格式化输出的神器f-string。在字符串前面加一个f就可以用花括号直接嵌入变量name 张三 age 28 print(f我叫{name}今年{age}岁)输出我叫张三今年28岁。变量到处用字符串拼接再也不痛苦。3.3 数据结构列表、字典与元组文件处理绕不开数据的组织和存储Python里三大数据结构必须熟练掌握。列表list就是有序的一组数据用方括号定义fruits [apple, banana, cherry] fruits.append(orange) # 末尾添加 fruits[0] # 取值apple for f in fruits: print(f)字典dict是键值对的集合用花括号定义堪称数据处理的瑞士军刀goods {苹果: 3.5, 香蕉: 2.0} goods[西瓜] 5.0 # 新增 print(goods[苹果]) # 3.5元组tuple是不可变的列表简单理解就是“一旦创建不能修改”用圆括号定义。在文件处理中元组常用于把一行数据拆成固定结构然后打包返回。一个经验之谈数据处理中字典当“统计表”极其好用。遇到“统计每个XX出现了多少次”这类需求字典的套路就是if key not in dict: dict[key] 0; dict[key] 1或者用collections.defaultdict更省事。等你后面读到我的文件处理实战部分你会发现字典真的无处不在。4. 文件处理从读出来到写进去4.1 文件路径的三种写法与坑读写文件的第一步是搞清楚文件在哪里。路径分两种绝对路径和相对路径。绝对路径从盘符或根目录写起比如C:\Users\你的名字\learn_python\data.txt相对路径则是相对于当前运行脚本所在目录直接写文件名data.txt就是“当前目录下的data.txt”。这里有一个新手最常踩的坑在VSCode里直接点运行按钮程序的工作目录不一定是你脚本所在目录。你可能费了半天劲创建一个data.txt放在hello.py旁边然后运行open(data.txt)结果报FileNotFoundError整个人懵掉。解决方法是要么用os.chdir()切换工作目录要么用pathlib模块显式构造绝对路径。我个人推荐后者代码是这样from pathlib import Path # 获取当前脚本所在目录 base_dir Path(__file__).parent file_path base_dir / data.txt__file__是Python内置变量代表当前脚本文件的路径.parent取它的上级目录。这样无论你在哪个目录运行脚本都能准确找到兄弟文件。这个习惯我从老项目一路带到新项目从来没有因为路径问题出过事故。4.2 读取文件的三种方式Python读取文件核心函数就一个open()配合moder之类的模式参数使用。最经典的写法是with open(data.txt, r, encodingutf-8) as f: content f.read() print(content)with关键字一定要理解清楚。它的作用是“上下文管理器”简单说就是代码块结束后自动关闭文件。如果你不用with写f open(...); content f.read(); f.close()一旦中间某行代码报错close()就不会执行文件句柄一直占着程序多了会出问题。所以从第一天开始就养成with open的习惯能避免无数潜在bug。读取还有两个常用变体f.readline()一次读一行f.readlines()把所有行读进一个列表。还有一种是遍历文件对象本身with open(data.txt, r, encodingutf-8) as f: for line in f: print(line.strip())逐行遍历这种方式非常高效尤其适合处理大文件。如果你的文件有好几百MB千万不能用read()一次性全部塞进内存内存分分钟爆掉。逐行读取的好处就是内存里永远只有一行数据再大的文件也能从容应对。4.3 编码问题UTF-8与GBK之战我敢说每一个学Python处理文件的人都至少被编码问题折磨过一两次。报错信息往往是这样的UnicodeDecodeError: gbk codec cant decode byte 0x...原因很简单Windows系统上不指定encoding参数时Python的open()默认用系统编码中文Windows就是GBK。而你自己创建的文件很可能是UTF-8编码VSCode默认UTF-8两边对不上就报错。解决办法也很直接永远在open()里显式指定encodingutf-8。读取中文文本、CSV文件、日志文件统一加上这句基本就能绕开编码问题。如果文件确实是GBK编码的比如某些老软件导出的数据那就改成encodinggbk。再不行就用encodinggb18030这是GBK的超集能兼容更多生僻字。判断文件编码的小技巧用VSCode打开文件看右下角显示的编码再决定你的encoding参数写什么。4.4 写入文件覆盖、追加、避免乱存写入比读取简单但模式要清楚。w模式是覆盖写每次运行都会把原文件内容清空再写a模式是追加写在文件末尾继续加内容。with open(output.txt, w, encodingutf-8) as f: f.write(第一行内容\n) f.write(第二行内容\n)注意write()不会自动换行必须自己写\n。如果想一次写多行可以用writelines()传入一个字符串列表用法是lines [第1行, 第2行, 第3行] with open(output.txt, w, encodingutf-8) as f: f.writelines(line \n for line in lines)还有个致命坑如果你用w模式打开一个本来就存在的文件程序一旦运行原文件内容直接被清空没有二次确认。新手很容易在测试阶段把辛辛苦苦手打的数据文件给冲掉。强烈建议写文件前先备份或者采用先写临时文件再重命名的策略。我就干过这种蠢事一个存了三千行数据的CSV被一句测试代码清空了当时想死的心都有。现在通用的稳妥做法是分两步先写output.tmp确认一切正常后再用os.replace(output.tmp, output.txt)替换原文件。这个操作是原子性的就算中途出错也不会损坏原文件。5. 实战一个货运单据处理小工具5.1 需求拆解把一堆杂乱的文本变成统计表说了这么多理论是时候来一个能直接上手的实弹了。我自己曾经帮物流公司的朋友处理过一批货运单据原始数据长这样我简化了很多但核心逻辑没变单号: HZ20241001, 货物: 电子产品, 数量: 150, 目的地: 上海 单号: HZ20241002, 货物: 服装, 数量: 80, 目的地: 北京 单号: HZ20241003, 货物: 电子产品, 数量: 200, 目的地: 深圳 单号: HZ20241004, 货物: 食品, 数量: 60, 目的地: 上海现在需求是按照“目的地”分组统计每个城市接收了多少批货物、总共多少件。如果人工一个个看几十行还行成千上万行就崩溃了。用Python十几行代码搞定。这个过程特别适合做实战练习因为它把几个重要知识点全串起来了用它读文件用open和for line in f用strip()清理行首尾用split(,)把一行拆成字段用split(:)提取冒号后面的值用字典做分组统计5.2 第一版代码能跑就算赢我先把完整代码贴出来初学者可以先抄下来运行再一行一行理解from pathlib import Path base_dir Path(__file__).parent input_file base_dir / goods.txt output_file base_dir / report.txt # 创建一个示例文件方便直接测试 if not input_file.exists(): with open(input_file, w, encodingutf-8) as f: f.write(单号: HZ20241001, 货物: 电子产品, 数量: 150, 目的地: 上海\n) f.write(单号: HZ20241002, 货物: 服装, 数量: 80, 目的地: 北京\n) f.write(单号: HZ20241003, 货物: 电子产品, 数量: 200, 目的地: 深圳\n) f.write(单号: HZ20241004, 货物: 食品, 数量: 60, 目的地: 上海\n) # 分组统计目的地 - [批次数, 总数量] stats {} with open(input_file, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue # 按逗号拆分成字段 parts line.split(,) # 提取目的地 dest_part parts[3].strip() # 目的地: 上海 destination dest_part.split(:)[1].strip() # 提取数量 qty_part parts[2].strip() # 数量: 150 quantity int(qty_part.split(:)[1].strip()) if destination not in stats: stats[destination] [0, 0] stats[destination][0] 1 stats[destination][1] quantity # 写入统计结果 with open(output_file, w, encodingutf-8) as f: f.write(目的地, 批次数, 总数量\n) for dest, (count, total_qty) in stats.items(): f.write(f{dest}, {count}, {total_qty}\n) print(f统计完成结果已保存到 {output_file})跑完之后report.txt长这样目的地, 批次数, 总数量 北京, 1, 80 上海, 2, 210 深圳, 1, 200看到没有零基础学到这里你已经能用自己的代码处理真实世界里的一份“微型报表”了。这个脚本你可以保存好以后遇到任何格式类似的单据文件只要改改分隔符和字段索引稍微调整一下就能复用。我这些年写的数据处理脚本有好几个就是从这个模板演化出去的。代码里值得留意的是if not line: continue这一步它的作用是完全跳过空行。真实数据文件经常有空行不跳过的话解析到空字符串会直接崩溃。这行代码朴实无华但实战价值极高。5.3 给需求升级坏行处理与容错上面的代码有一个隐藏问题如果某个单据少了一个字段比如某行没有数量int()转换就会抛异常整个程序粗暴中断后面的数据全不处理了。真实世界的脏数据无处不在所以你一定要学会异常处理。改动很小但效果天壤之别with open(input_file, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue try: parts line.split(,) dest_part parts[3].strip() destination dest_part.split(:)[1].strip() qty_part parts[2].strip() quantity int(qty_part.split(:)[1].strip()) except (IndexError, ValueError) as e: print(f解析失败已跳过该行: {line}错误原因: {e}) continue if destination not in stats: stats[destination] [0, 0] stats[destination][0] 1 stats[destination][1] quantitytry...except要做的事很简单把可能出错的代码包起来如果出错就执行except里的处理逻辑。这里IndexError对应字段缺失ValueError对应数量不是数字。实际场景中错一行就全盘崩溃是不可接受的你的任务就是把“坏行”揪出来但别让整个任务殉葬。顺带说一句如果数据标点符号不统一一会儿英文逗号一会儿中文逗号你可以在解析前加一句line line.replace(, ,)。这种小技巧看着不起眼但处理真实文件时我几乎每次都要用。数据从来不像教程里那样干净这是文件处理的第一定律。6. 常见问题与排查技巧实录6.1 高频报错从报错信息倒推问题初学者最怕的就是报错其实报错是Python在跟你对话告诉你怎么改。我梳理了几个高频报错以后遇到直接对号入座报错信息含义常见原因解决方案FileNotFoundError: [Errno 2] No such file or directory文件不存在路径写错、文件名拼错、工作目录不对用Path(__file__).parent拼接绝对路径UnicodeDecodeError解码失败编码不匹配显式指定encodingutf-8或encodinggbkNameError: name xxx is not defined变量未定义拼写错误、变量还没赋值就使用检查变量名是否前后一致TypeError: can only concatenate str类型不匹配字符串和数字强行相加用str()或int()做类型转换IndentationError: unexpected indent缩进错误空格和Tab混用统一4个空格重新缩进ModuleNotFoundError: No module named xxx模块缺失第三方库没安装终端执行pip install xxx这个表你可以收藏起来排错时逐条对照。我的一个个人习惯是报错信息里最后一行往往才是最关键的前面一长串是堆栈调用过程新手不用全部看懂先盯最后一行就能解决80%的问题。6.2 一个真实案例Python路径与工作目录的惨痛教训去年有个刚入行的同事拿着脚本问我说在VSCode里明明能跑但双击运行就报文件找不到。我看了一下代码里写的是open(data.csv, r)。原因很清楚这个脚本依赖“当前工作目录是脚本所在目录”这个假设但Windows双击运行时工作目录变成了桌面或者系统目录自然找不到data.csv。我给他改成Path(__file__).parent / data.csv问题立刻解决。这个案例值得所有零基础朋友记住写文件路径时永远不要相信当前目录显式拼接才是王道。顺带说一下如果你在终端里手动运行python 脚本路径.py其实也可以先cd到脚本目录再执行这样相对路径也能工作。但cd这种事靠人记总有不记得的时候写在代码里的路径才靠得住。6.3 环境变量与PATH问题排查如果你的python --version没输出或者提示python 不是内部或外部命令大概率是PATH的问题。排查步骤三步走打开“系统属性” - “环境变量”检查Path里有没有Python安装路径。没有就手动加上典型路径是C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\和同目录下的Scripts\。修改完环境变量必须关闭所有终端窗口再重新打开否则不生效。如果还是不行试试重新安装Python安装向导里勾选“Add Python to PATH”再验证。还有个经常出现的情况明明装了Python但python打开的是商店版Python的安装引导页。这是Windows的系统应用别名在捣鬼去“设置” - “应用” - “高级应用设置” - “应用执行别名”把python.exe和python3.exe关掉即可。这类问题很琐碎但不解决后面每一步都会烦躁。7. 进阶方向文件处理之外还能做什么7.1 从文本文件到结构化数据完成了一个货运单据处理的小项目后你大概已经感觉到文件处理不仅仅是读写它真正的价值在于从非结构化文本中提取结构化信息。顺着这个思路你可以把下一站放在pandas上。pandas是Python数据分析的绝对核心库它的read_csv()、read_excel()函数一行就能把CSV或Excel文件加载成数据表。比如import pandas as pd data pd.read_csv(goods.csv, encodingutf-8) print(data.groupby(目的地)[数量].sum())看到没有我们手动写的统计逻辑pandas两行就搞定了。我并不是让你从零开始就学pandas而是建议你先把基础的文件读写练扎实再进入pandas的世界会非常顺畅。因为那时你已经理解底层在做什么pandas只是帮你把底层封装好了。7.2 大文件性能优化逐行读完再逐行写如果你要处理的是几GB的日志文件一次性read()必然内存爆炸一次性readlines()也一样。正确的姿势是逐行处理、逐行输出with open(big.log, r, encodingutf-8) as f_in: with open(big_filtered.log, w, encodingutf-8) as f_out: for line in f_in: if ERROR in line: f_out.write(line)这段代码会把原日志中所有含“ERROR”的行提取出来。因为每次内存只保留一行所以无论文件多大程序吃内存都几乎恒定。实际工作中我处理过几十GB的游戏服务器日志靠的就是这个套路。7.3 与办公场景结合处理Excel与CSV对我认识的很多新人来说学Python的最大动机就是不想再手动复制粘贴Excel数据了。如果你有这个需求那么pandas配合openpyxl能解放你大量时间。pip install pandas openpyxl然后读Excel只需import pandas as pd df pd.read_excel(数据表.xlsx, sheet_name汇总) print(df.head()) # 查看前5行写入Excel也很简单df.to_excel(统计结果.xlsx, indexFalse)这一套下来什么月度报表、销售统计、库存汇总只要数据源是表格的几乎都能自动化。学到这里你已经不是“零基础”而是可以接一些简单的自动化小活了。8. 我的几点学习建议最后趁着这个实战教程收尾分享几个这些年带新人总结出来的掏心窝子的建议。第一一定要手动敲代码。复制粘贴永远学不会编程。哪怕照着敲敲完你在脑中过一遍每一行在干嘛效果远超你看了十遍教程。第二遇到报错先自己读一遍。别急着截图问人先看最后一行报错信息再回看你敲的代码很多时候就是拼错一个单词或者少写一个冒号、缩进不对。自己排查出来一次你对这个坑的记忆就牢固十年。第三多用print()打点调试。新手总觉得print()太低级其实它是最直接的调试工具。不确定一个变量的值时print()出来看不确定哪段代码执行了加一句print(到这里了)。我把这个叫“探针式调试”简单粗暴但极其有效。第四从自己身边的痛点下手做项目。文件处理学会了看看自己手头有没有重复性的文件整理工作——合并多个文本文件、批量重命名文件、从日志中提取信息这些都能用本文学到的东西实现。用真实需求驱动学习你才有动力坚持下去。把Hello World到文件处理这条路走通你的Python就算是真正入门了。后面无论是学爬虫、数据分析、还是自动化办公你都有了扎实的地基。哪怕只是把这一篇里的货运单据脚本跑通、改一改、用在自己手头的数据上也算成功迈出了第一步。剩下的就是保持动手持续碰壁然后把这些坑一个一个填平。
返回列表