You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:01:23