如何使用argparse模块传递文件参数并修改Python脚本中的文件
命令行读取文本文件时遇到FileNotFoundError和AttributeError问题
我想从命令行读取文本文件提取数据用于开发,但一直报错。直接用f = open("file", "r")会触发FileNotFoundError;注释掉这行后又触发AttributeError。试过把这行改成args.file,还是没解决,现在需要帮忙实现正确的文件输入,以及用文件方法修改文件。
现有代码
import argparse parser = argparse.ArgumentParser() parser.add_argument("file", type=argparse.FileType('rt')) args = parser.parse_args() #f = open("file", "r") ---line1 lines = file.readlines() file.close() print(lines[0].rstrip('\n')) print(lines[1])
报错信息
错误1:FileNotFoundError
执行命令:
py parser.py demo.txt
报错内容:Traceback (most recent call last): File "C:\Users\nthotapalli\PycharmProjects\pythonProject\parser.py", line 6, in <module> f = open("file", "r") FileNotFoundError: [Errno 2] No such file or directory: 'file'
错误2:AttributeError
执行命令:
py parser.py demo.txt
报错内容:Traceback (most recent call last): File "C:\Users\nthotapalli\PycharmProjects\pythonProject\parser.py", line 9, in <module> lines = file.readlines() AttributeError: 'str' object has no attribute 'readlines'
问题分析与解决方法
1. 错误原因
- FileNotFoundError:
open("file", "r")是硬编码打开名为file的文件,而非命令行传入的demo.txt,自然找不到目标文件。 - AttributeError:代码里直接用
file.readlines(),这里的file是Python内置的类型名称,不是argparse解析得到的文件对象。实际命令行传入的文件对象存在args.file中,直接写file会被识别为字符串类型,因此没有readlines方法。
2. 修正后的代码
使用argparse返回的文件对象,同时推荐用with语句自动管理文件关闭,避免手动调用close()的风险:
import argparse parser = argparse.ArgumentParser() parser.add_argument("file", type=argparse.FileType('rt')) args = parser.parse_args() # 用with语句自动处理文件打开/关闭 with args.file as f: lines = f.readlines() print(lines[0].rstrip('\n')) print(lines[1]) # 如果需要修改文件,需将打开模式改为读写模式(比如'r+'),示例: # parser.add_argument("file", type=argparse.FileType('r+')) # with args.file as f: # # 读取原内容 # content = f.read() # # 将指针移到文件开头 # f.seek(0) # # 写入修改后的内容 # f.write("新增头部内容\n" + content) # # 截断多余内容(若新内容比原内容短) # f.truncate()
3. 关键注意点
- 用
argparse.FileType指定类型后,args.file已经是打开的文件对象,无需再手动调用open。 with语句会在代码块结束后自动关闭文件,比手动close()更安全,能避免因异常导致文件未关闭的问题。- 修改文件时必须调整打开模式为
r+(读写),操作时注意文件指针位置,防止错误覆盖内容。
内容的提问来源于stack exchange,提问作者NagaTejaswi
相关产品推荐
相关产品推荐

