资讯动态

Python输入输出全解析:从input()到文件读写,避开常见坑

发布时间:2026/9/8 4:35:23 来源:尧图企业网站定制
很多刚接触Python的朋友一上来就盯着变量、循环、函数这些东西猛学结果真到自己写点小工具的时候反而卡在“怎么把数据弄进去、怎么把结果拿出来”这个最基础的环节上。这次借着“课件1-3Python输入输出”这个主题我把输入输出相关的知识点、常见坑位和实操套路一次讲透。Python的输入输出说白了就是程序和外部世界对话的两条通道输入是程序接收你敲的键盘内容、读到的文件数据输出是把计算结果展示在屏幕上、写进日志或者存到文件里。这套东西单独拎出来看好像没什么技术含量但它决定了你写的脚本好不好用、能不能自动化、能不能跟其他系统对接。想用Python做数据处理、写自动化脚本、爬虫、甚至搞量化分析的人这块是绕不过去的基础功。下面我按自己踩坑总结的经验从学习思路、核心语法、实操步骤到问题排查一条线完整讲清楚。1. 内容整体设计与思路拆解1.1 先搞明白“输入输出”到底解决什么问题我见过不少学员学了半个月Python问他input()和print()有什么用他说“不就是让用户输东西、打印东西嘛”。这话对但格局小了。输入输出的本质是程序的数据边界。任何一段Python代码不管逻辑多复杂最终都逃不开三件事拿数据、算数据、给数据。拿数据靠的就是输入机制给数据靠的就是输出机制。如果输入输出的设计不合理后面所有逻辑都白搭。举个最日常的例子你写了个计算BMI的脚本如果身高体重是写死在代码里的那每次换个人测都得改代码重新跑但如果用input()接收用户输入这个脚本就能给任何人用。这就是输入输出最朴素的价值——把程序和具体数据解耦让程序具备复用性。Python官方文档里对输入输出的定义也很有意思输入输出是程序与外部环境交互的主要途径包括标准输入输出、文件I/O、网络I/O等。初学者阶段我们主要接触的是标准输入输出键盘、屏幕和文件I/O读写文件。前者解决人机交互问题后者解决数据持久化问题。1.2 为什么Python的输入输出值得单独花一节课讲说实话单看语法,input()和print()都不难难的是藏在背后的几个细节。第一是类型问题。Python的input()不管你输入什么返回的都是字符串。你想让用户输入年龄然后做加法直接input()拿到的“18”是字符串不能和数字直接相加必须先int()转换。这个坑十个新手九个踩。第二是格式化输出的选择。Python给字符串格式化提供了至少三种主流方式%格式化、str.format()、f-string。到底用哪种各有优劣但f-string在Python 3.6以后几乎成了事实标准简洁、直观、性能还好。很多人学的时候三种都混着用代码风格不统一回头维护起来很痛苦。第三是文件读写要特别注意编码和资源释放问题。Python的open()如果忘了指定encodingutf-8Windows环境下跑出来的中文大概率乱码如果忘了用with语句文件句柄可能一直占用不释放。这些细节小但致命。我会把内容分成三层来讲基础语法层、格式化进阶层、文件与实战层。层层递进每层都有配套的坑位提示这样学完就能直接用。2. 核心细节解析与实操要点2.1 控制台输入的底层逻辑input()不是你想的那样简单input()的官方定义是从标准输入读取一行文本去除末尾的换行符以字符串形式返回。注意它永远返回字符串不存在例外。这里有几个很多人不知道的细节。input()可以接受一个字符串参数作为提示语比如input(请输入你的名字)这个提示语会先打印到屏幕上然后等待用户输入。有些老教程会让你先print(提示)再input()那是多此一举直接传参就行。再一个细节是input()会阻塞程序运行直到用户按下回车键才继续执行。这意味着如果你写了一个脚本中间没有人来输入程序就会一直卡在那里。在一些自动化场景里这可能是好事等用户确认也可能是坏事导致程序挂起。我写自动化脚本时如果不需要交互绝不使用input()宁可直接在代码里写好参数或从文件读取。另外要留意input()读取的是“一行”本身不会做任何类型转换和内容校验。用户输入多少就能拿到多少哪怕用户输入的是乱码、空行input()都照单全收。生产环境里这个特性要求我们必须做输入校验。2.2 print()输出的隐藏参数用对了效率翻倍print()可能是大家最早接触的函数但它的完整签名很多老手也记不全。完整的print()签名是这样的print(*objects, sep , end\n, filesys.stdout, flushFalse)展开讲讲这些参数干什么用的。sep参数是多个对象之间的分隔符默认是一个空格。你print(a, b)输出是“a b”如果你想要“a,b”传sep,就行。这在把列表元素拼接成一行输出的时候非常有用比循环加字符串拼接快多了。end参数是输出末尾的字符默认是换行符\n。很多人不知道可以改。比如你想连续打印多个结果但不换行可以让end你想让多个print之间用空格隔开可以让end 。写进度条或者需要动态刷新同一行内容的时候end\r配合flushTrue能做出很好的效果。file参数是输出目标默认是sys.stdout也就是屏幕。你可以传一个文件对象进去让print()直接把内容写入文件而不必手动write()。这在生成日志、导出报告时特别好用。举个小例子with open(log.txt, w, encodingutf-8) as f: print(这是日志内容, filef)flush参数是是否强制刷新缓冲区默认False。正常情况下print的内容先进缓冲区等缓冲区满了或者程序结束时才会真正写到目标设备。在某些场景下比如正在往管道里写数据或者写进度条你需要实时输出就设置flushTrue。2.3 格式化输出的三种流派我的推荐顺序很明确格式化输出是输入输出模块里的重头戏因为绝大多数场景下你不是打印一个裸数据而是要拼一段有结构的文字。最老的流派是%格式化。它从C语言的printf风格继承而来用%s、%d、%f这些占位符。优点是兼容性好Python所有版本都支持缺点是参数多了以后可读性很差容易写错。name Alice age 25 print(我叫%s今年%d岁 % (name, age))第二种是str.format()方法。它用花括号{}做占位符支持索引、命名参数等更灵活的方式。比%格式化可读性好一些但写起来还是有点繁琐尤其当参数很多时。print(我叫{}今年{}岁.format(name, age)) print(我叫{name}今年{age}岁.format(namename, ageage))第三种是f-stringPython 3.6才引入的语法糖。在字符串前面加f花括号里直接写变量名甚至表达式写起来最直观执行速度也快。我个人强烈建议新写的代码一律用f-string。print(f我叫{name}今年{age}岁) print(f今年是{2025 - age}年出生的)关于格式化还有一个格式规范值得一提就是冒号后面跟格式说明。f-string里可以做数字对齐、补零、千分位分隔。score 0.8156 print(f正确率{score:.2%}) # 输出正确率81.56% print(f金额{1234567:,}) # 输出金额1,234,567 print(f编号{42:05d}) # 输出编号00042这些操作在日常写报表、打印日志时非常常见比来回转换强多了。2.4 文件输入输出的核心open()的mode参数要选对除了屏幕上打打杀杀输入输出的另一大块是文件读写。Python内置的open()函数是文件操作的大门。open()最关键的参数有两个文件路径和打开模式。模式决定了你要对文件做什么操作。常见的有r只读模式文件必须存在否则报FileNotFoundErrorw写入模式文件不存在就新建存在就清空重写a追加模式文件不存在就新建存在就在末尾继续写x独占创建模式文件已存在就报错防止覆盖rb/wb二进制读写模式处理图片、音频、视频等非文本文件r读写模式指针在文件开头新手最容易踩的坑是混淆w和a。w会把原文件内容全部清空再写如果你只是想追加内容必须用a。我见过有人写脚本不小心用w模式覆盖了几天积累的数据哭都来不及。编码方面open()默认编码是平台相关的Windows下可能是gbkLinux/macOS下一般是utf-8。为了统一我写代码永远显式指定encodingutf-8。另外尽量用with open() as f这种上下文管理器它能自动关闭文件避免资源泄漏。# 推荐写法 with open(data.txt, r, encodingutf-8) as f: content f.read()# 不推荐写法 f open(data.txt, r) content f.read() f.close()第二种写法如果中间抛了异常f.close()就不会执行文件句柄就泄漏了。虽然程序退出后系统会回收但长期运行的服务会越来越耗资源。2.5 类型转换是实现输入输出的润滑剂输入输出的过程中类型转换就像一座桥。input()返回字符串print()能接收任意类型它会自动转成字符串打印但你要做运算就不能拿字符串直接加数字。Python内置了几个常用的类型转换函数。int(x)把x转成整数如果x是字符串且内容不是纯数字会抛ValueErrorfloat(x)把x转成浮点数str(x)把x转成字符串list(x)把x转成列表tuple(x)把x转成元组bool(x)把x转成布尔值需要注意空字符串、空列表、0、None都会转成False这一块本身不难难点在于“什么时候该转”。我的原则是数据进来时尽量早转数据出去时统一转字符串。不要在中间步骤里反复转换既浪费性能又容易出错。比如写计算平均分的脚本用户输入三个成绩字符串你先转成int存到列表里最后求平均值而不是每次比较前都现场转换。scores [] for i in range(3): s int(input(f请输入第{i1}门课的成绩)) scores.append(s) average sum(scores) / len(scores) print(f平均分{average:.2f})3. 实操过程与核心环节实现3.1 环境准备先确认Python环境没问题在开始写输入输出代码之前先确保Python安装配置没问题。很多同学学到一半各种报错最后发现是Python版本太老或环境变量没配好。建议安装Python 3.8以上版本因为f-string的调试功能号比如f{x}在3.8才加进来的。安装时务必勾选“Add Python to PATH”。装完打开终端或命令行输入下面命令验证python --version如果在Windows上弹出Windows商店或者什么都不输出大概率是PATH没配好。如果输入python没反应可以试试输入py --versionWindows上Python安装器会同时注册py启动器。开发环境这块我推荐VS Code加Python插件。不需要装太多扩展Python官方插件就够了。配置也很简单打开命令面板输入“Python: Select Interpreter”选择你自己的Python解释器即可。写完代码直接右键运行或者在集成终端里python xxx.py运行都比较顺。3.2 从控制台交互开始写一个用户信息录入脚本基础语法光看是不行的直接动手写个小项目最能加深理解。这里我设计一个用户信息录入脚本把所有基础知识点都过一遍。需求很简单让用户输入姓名、年龄、城市、身高然后按格式输出一段个人简介。# user_info.py name input(请输入姓名) age int(input(请输入年龄)) city input(请输入城市) height float(input(请输入身高米)) print(f\n 个人信息 ) print(f姓名{name}) print(f年龄{age}岁) print(f城市{city}) print(f身高{height}m) print(f三年后的年龄{age 3}岁) print(f成年与否{成年 if age 18 else 未成年}) print(f简介我叫{name}来自{city}今年{age}岁身高{height:.2f}米。)几个值得展开的细节年龄我用int()转成整数是为了后面能直接做加法还能用条件表达式判断是否成年。身高用float()是为了保留小数位输出时用{height:.2f}控制保留两位小数。这就是典型的“数据进来时尽早转”的思路。注意如果用户输入的不是数字比如年龄输入了“十八”int(十八)会直接抛ValueError程序当场崩溃。健壮一点的做法是用try/except捕获异常并提示用户重新输入。这个后面在问题排查章节我会专门展开。3.3 格式化输出进阶把日志系统的基础打好日志是输入输出在真实项目中最常见的应用场景之一。很多人写日志用的是print()直接打印临时调试可以但真正要存留的时候就不够看了。我用一个日志格式化的例子演示f-string和print()参数怎么配合使用。import datetime def log(level, message): now datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) print(f[{now}][{level}] {message}, flushTrue) log(INFO, 用户登录成功) log(ERROR, 数据库连接超时)这段代码虽然简单但里面有个细节值得学strftime()是时间格式化的方法它把时间对象转成指定格式的字符串。这个在日志输出中几乎是标配。如果你想把日志同时写到文件和控制台可以利用print()的file参数import sys import datetime log_file open(app.log, a, encodingutf-8) def log(level, message): now datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) line f[{now}][{level}] {message} print(line, flushTrue) # 输出到控制台 print(line, filelog_file, flushTrue) # 写入日志文件 log(INFO, 系统启动) log(WARNING, 内存使用率偏高请注意) log(ERROR, 配置文件缺失)这里我故意用open()而不是with是因为log函数里需要多次写入如果每次都用with打开关闭性能损耗大。但这种写法要求你在程序结束前手动调用log_file.close()否则最后的数据可能没刷新到磁盘。实际项目中更推荐用logging模块但理解print()的file参数能帮你明白logging模块底层在做什么。3.4 文件读写实战实现一个电影收藏管理器接下来做一个稍微完整的小项目电影收藏管理器。功能包括显示当前收藏、添加新电影、保存到文件、从文件读取。先定义两个函数分别负责保存和加载数据。数据用CSV格式存储每一行是一部电影的标题、导演、评分。# movie_manager.py import os DATA_FILE movies.csv def load_movies(): if not os.path.exists(DATA_FILE): return [] movies [] with open(DATA_FILE, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue parts line.split(,) if len(parts) 3: title, director, rating parts movies.append({title: title, director: director, rating: float(rating)}) return movies def save_movies(movies): with open(DATA_FILE, w, encodingutf-8) as f: for m in movies: f.write(f{m[title]},{m[director]},{m[rating]}\n) def show_movies(movies): if not movies: print(暂无收藏电影快去添加吧。) return print(f{标题:15}{导演:10}{评分:5}) print(- * 30) for m in movies: print(f{m[title]:15}{m[director]:10}{m[rating]:5.1f}) def add_movie(movies): title input(请输入电影标题) director input(请输入导演) rating float(input(请输入评分0-10)) movies.append({title: title, director: director, rating: rating}) print(f电影《{title}》已添加。) def main(): movies load_movies() while True: print(\n 电影收藏管理器 ) print(1. 显示所有电影) print(2. 添加新电影) print(3. 保存并退出) choice input(请选择操作) if choice 1: show_movies(movies) elif choice 2: add_movie(movies) elif choice 3: save_movies(movies) print(数据已保存再见) break else: print(无效选择请输入1-3。) if __name__ __main__: main()这段代码把前面讲的输入输出知识全部揉进去了。input()接收用户操作选择虽然这里没转int直接用字符串比较也是可以的。show_movies()里用f-string的格式规范控制对齐{m[title]:15}表示左对齐占15个字符宽度{m[rating]:5.1f}表示右对齐5个字符宽度且保留1位小数。这些细节让输出在控制台里像表格一样整齐。文件读写部分有两个关键点。load_movies()里的line.strip()是去掉行尾的换行符否则存进去的title会带一个\nsplit(,)把一行数据拆成三块。save_movies()里用f-string把字典的值拼接成CSV行。整个过程没有用csv模块是为了让你看到底层的字符串处理逻辑实际项目用csv模块更稳妥。如果你忘了with open会帮你close文件还是手动加close的话写文件时如果程序中途崩溃数据可能就没写完。with语法能最大限度避免这个问题。3.5 用代码块展示完整效果与预期输出上面这个小项目写完后正常情况下运行效果大概是这样的请输入电影标题流浪地球2 请输入导演郭帆 请输入评分0-108.3 电影《流浪地球2》已添加。 电影收藏管理器 1. 显示所有电影 2. 添加新电影 3. 保存并退出 请选择操作1 标题 导演 评分 ------------------------------ 流浪地球2 郭帆 8.3注意在Windows的cmd里中文字符的显示宽度和英文字符不一样用中文占位可能对不齐这个是终端字体的问题不是代码的问题。实际测试如果发现列没对齐别慌要么换等宽字体要么在输出里少用中文对齐。4. 常见问题与排查技巧实录4.1 ValueError: invalid literal for int()这是新手最经常撞见的报错。当你写int(input())并且用户输入的不是纯数字时Python就抛这个错。比如用户本来该输入年龄结果手滑输入了“18岁”int(18岁)就失败了。解决方案有两个层面。第一个是主动防御在转换前先判断字符串是否由数字组成age_str input(请输入年龄) if age_str.isdigit(): age int(age_str) else: print(输入不合法请输入纯数字)第二个是异常捕获更健壮适合写大程序while True: try: age int(input(请输入年龄)) break except ValueError: print(输入不合法请输入纯数字)while True配合try/except是输入校验的经典套路能保证用户直到输入正确为止才能往下走。如果是在考试或作业里异常捕获会比isdigit()拿到的分更多因为它考虑到了程序运行的鲁棒性。4.2 中文乱码问题编码格式混战写文件时打印中文变成了乱码十有八九是编码问题。Windows默认的GBK和Linux/macOS的UTF-8互相不认这是历史遗留问题。最直接的解决方案所有文件读写一律显式指定encodingutf-8。不要偷懒不要相信系统默认值。代码里写文件时with open(output.txt, w, encodingutf-8) as f: f.write(中文内容)读文件时with open(output.txt, r, encodingutf-8) as f: content f.read()两边编码一致就不会乱码。如果读的是从网上下载的数据不确定对方用的什么编码可以尝试用gbk解码或者用chardet库先检测编码。但在自己写的项目里统一UTF-8是基本素养。还有一个小坑在用print()往Windows的控制台输出中文时如果控制台代码页不是UTF-8也可能显示乱码。这种情况不是代码的问题是Windows控制台的编码问题。你可以在代码开头加一句import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)不过这种写法在有些环境下会出问题更推荐直接改控制台为UTF-8模式或者在VS Code里运行基本就没有乱码烦恼了。4.3 输入卡住不动、按回车没反应怎么办很多人第一次写input()运行的时候发现光标一直在闪输什么都没反应然后怀疑程序卡死了。其实不是是input()在等待你输入而且你必须输入完成后按回车才算结束。如果你觉得程序“卡住”了检查一下当前是不是有input()在运行。解决办法很简单在提示语里告诉用户“请按回车确认”让使用的人心里有数。比如input(按回车键继续...)这个写法在脚本暂停、查看中间结果时非常常用。有些程序在Windows上跑小黑窗一结束就关闭看不到输出结果大家习惯在脚本末尾加上面这句让窗口保持打开。另外注意input()本身不接收“任意键”它必须等回车键。如果你要监听特定键盘事件比如按q退出input()办不到需要第三方库比如keyboard或pynput那是另一个话题了。4.4 文件写入后内容不显示缓冲区刷新问题有同学遇到过这种情况用write()写完文件马上用记事本打开发现内容是空的过一会儿再打开内容又出现了。这个“诡异”现象其实是缓冲区在作怪。write()并不是把数据立即写到磁盘而是先写进内存缓冲区。缓冲区满了或文件关闭时才会真正写入磁盘。如果你用with open()写退出with块时文件会被自动close数据也会被刷新到磁盘一般不会有这个问题。但如果你用f open()后一直不关闭又立刻读文件就可能读到空内容。解决办法是写入后立即刷新缓冲区f.flush()或者干脆写成with结构让它自动管理。我自己的习惯是能with就with尽量减少手动flush和close的时机。还有一个类似的问题print()在管道模式下可能不实时输出。比如你运行python script.py | more屏幕上看不到输出要过一会儿才冒出来。这就是print的缓冲在作怪加flushTrue可以强制实时输出。4.5 关于CSV文件的一个隐秘坑位我在前面示例里用split(,)解析CSV行有个隐藏问题没说如果电影标题本身包含逗号比如“蜘蛛侠英雄远征,还是啥”split(,)会把一行拆成4段len(parts) ! 3这一行就会被丢弃。这种问题在实际数据处理中非常常见因为CSV的字段是可以带逗号的字段用引号包裹。为了解决这个问题Python内置的csv模块是更好的选择import csv with open(movies.csv, r, encodingutf-8) as f: reader csv.DictReader(f, fieldnames[title, director, rating]) for row in reader: movies.append(row)写入时with open(movies.csv, w, encodingutf-8, newline) as f: writer csv.DictWriter(f, fieldnames[title, director, rating]) writer.writeheader() writer.writerows(movies)csv模块能正确处理引号、逗号、换行等特殊情况。不要因为简单的例子就用split硬拼一旦数据复杂化维护成本直线上升。我在实际工作中凡是处理表格型数据一律用csv模块不手写解析逻辑。4.6 输入输出常见问题速查表问题现象可能原因解决方案int(input()) 报错用户输入了非数字内容用try/except或isdigit()做校验中文写文件乱码编码不匹配读写都显式指定encodingutf-8程序运行后没有输出print缓冲未刷新加flushTrue或退出with块文件写入后内容为空缓冲区未落盘用with自动close或手动flush()打开文件提示文件不存在路径错误或模式用错检查路径用写入模式先创建文件控制台中文对不齐中英文宽字符不一致换等宽字体或减少中文排版这张表是我在实际教学和项目经验里总结出来的最高频问题。遇到问题先对应着查能省很多排错时间。5. 进一步扩展用输入输出搭建更实用的脚本5.1 让输入输出自动化起来重定向标准输入输出控制台输入输出不仅能手动操作还能用重定向机制自动化。在Linux/macOS或Windows的命令行中你可以把文件内容作为程序输入把程序输出重定向到文件。python calculate.py input.txt output.txt这行命令的意思是calculate.py的input()不再从键盘读而是直接从input.txt里逐行读取print()的输出全部写入output.txt。这种方式非常利于批量处理数据和自动化测试。举个实际例子你写了一个计算器脚本想快速测试100组数据手动一组组输入肯定不现实。这时你把测试数据按行写入input.txt跑一次重定向命令结果全部到output.txt比手动操作高效太多了。顺带一提这个机制也是OJ在线评测系统的核心原理。你在刷算法题时题目给定的输入样例本质上就是扔给程序的标准输入流而程序打印的结果要和标准答案比对。理解了标准输入输出重定向你自然就明白OJ为什么能自动评判代码了。5.2 从txt到JSON用json模块扩展文件输出格式CSV适合表格型数据但遇到嵌套结构的数据就不方便了。JSON是另一种极其常用的文件格式Python的json模块内置支持读写都只有一行代码。import json movies [ {title: 流浪地球2, director: 郭帆, rating: 8.3}, {title: 星际穿越, director: 诺兰, rating: 9.4} ] # 写入JSON文件 with open(movies.json, w, encodingutf-8) as f: json.dump(movies, f, ensure_asciiFalse, indent2) # 读取JSON文件 with open(movies.json, r, encodingutf-8) as f: loaded_movies json.load(f)注意写入时的ensure_asciiFalse如果不加默认会把中文转成\uXXXX格式的转义序列文件里全是乱码一样的东西肉眼没法读。indent2参数让JSON格式化打印便于人阅读。这在对接API、保存配置、做数据交换时非常常用。5.3 用输入输出做数据统计分析实用小案例最后放一个综合案例从CSV文件读取全班同学的数学成绩统计最高分、最低分、平均分、及格率并把统计结果写入报告文件。import csv def load_scores(filepath): scores [] with open(filepath, r, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: scores.append({ name: row[姓名], score: int(row[成绩]) }) return scores def analyze(scores): values [s[score] for s in scores] total sum(values) count len(values) avg total / count passed sum(1 for v in values if v 60) pass_rate passed / count return { 最高分: max(values), 最低分: min(values), 平均分: round(avg, 2), 及格率: f{pass_rate:.2%} } def write_report(stats, filepath): with open(filepath, w, encodingutf-8) as f: for key, value in stats.items(): f.write(f{key}{value}\n) def main(): scores load_scores(scores.csv) stats analyze(scores) print(stats) write_report(stats, report.txt) if __name__ __main__: main()这里的核心是无处不在的输入输出load_scores()是文件输入analyze()是数据处理write_report()是文件输出print(stats)是控制台输出。一个简单的数据分析流程被拆得清清楚楚每个环节的输入输出边界都很明确。如果你要处理的数据量更大比如几十万行用纯Python跑也能跑但性能上会差一些这时可以考虑换成Pandas它内部的读取和输出API设计思路和Python内置的是一致的理解了原生的输入输出过渡到Pandas会非常平滑。6. 写在最后的实操心得我在这几年的项目中反复写输入输出最大的感受就是这块内容看似简单但它决定了代码的“对外接口”好不好用。你在团队里写一个模块别人怎么调用你的程序无非就是传参数、读文件、看输出。输入输出设计得好合作起来就顺设计得糙后面全是沟通成本。有个习惯我强烈建议养成所有对外输出都走统一格式。比如日志里时间统一用YYYY-MM-DD HH:MM:SS数值统一用两位小数布尔值统一打印成“是/否”。这能让你的脚本看起来专业得多排查问题的时候也容易对齐时间线。我见过太多临时脚本今天print这个格式、明天print那个格式回头一看根本没法对数据这是典型的输出设计失败。编码问题上也再啰嗦一句只要是读写文本文件一律带encodingutf-8不要信任任何平台默认值。这句话值不值钱等你在Windows上被乱码折磨得抓狂的时候就知道了。最后再分享一个小技巧调试输入输出可以用一个小技巧快速验证逻辑。你需要调试一个input()函数但又不想每次手动输入测试数据可以在运行命令里重定向输入python -c print(测试) temp_input.txt python your_script.py temp_input.txt这样脚本会自动读取temp_input.txt内容作为输入你不用一遍遍打字调试效率高很多。输入输出这条线如果学得扎实后面学文件处理、爬虫、数据分析都会顺畅很多因为所有东西最终都要落到“怎么把数据拿进来、怎么把结果送出去”这个基本框架上。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价