如何让Python脚本接收命令行传入的自定义输入文件?
解决方案与问题分析
方法1:用sys.argv直接获取命令行参数(新手友好)
这是最直观的实现方式,逻辑和你原脚本一致,仅将固定文件名改为从命令行接收:
import sys # 校验参数是否传入 if len(sys.argv) < 2: print("用法:python script.py input_file.txt") sys.exit(1) input_file = sys.argv[1] # 动态生成输出文件名(可自定义规则) output_file = f"{input_file}_result.txt" with open(input_file, 'r') as f, open(output_file, 'w') as w: for line in f: # 处理空行避免索引错误 if line.strip(): new_line = line.split(",")[0] w.write(new_line + "\n")
执行命令:python3 python_script.py input_file.txt
方法2:修复fileinput的用法
你之前的fileinput写法核心问题是每次循环都以写入模式打开输出文件,会清空之前的内容,导致最终文件为空。正确写法应该是打开一次输出文件后批量写入:
import fileinput import sys # 获取输入文件名(兼容多文件传入场景) current_input = fileinput.filename() if fileinput.filename() else sys.argv[1] output_file = f"{current_input}_result.txt" with open(output_file, 'w') as w: for line in fileinput.input(): if line.strip(): new_line = line.split(",")[0] w.write(new_line + "\n")
如果需要处理多个输入文件(每个文件对应一个输出):
import fileinput current_file = None output_writer = None for line in fileinput.input(): # 切换文件时更新输出流 if fileinput.filename() != current_file: if output_writer: output_writer.close() current_file = fileinput.filename() output_file = f"{current_file}_result.txt" output_writer = open(output_file, 'w') if line.strip(): new_line = line.split(",")[0] output_writer.write(new_line + "\n") # 最后关闭文件流 if output_writer: output_writer.close()
方法3:pandas的正确处理方式
你之前的pandas写法错误是因为fileinput.input()返回的是迭代器,而非pd.read_csv可直接识别的文件路径/对象。正确实现:
import pandas as pd import sys if len(sys.argv) < 2: print("用法:python script.py input_file.txt") sys.exit(1) input_file = sys.argv[1] output_file = f"{input_file}_result.txt" # 读取第一列数据,忽略表头(根据你的需求调整header参数) df = pd.read_csv(input_file, sep=',', usecols=[0], header=None) # 保存结果,不保留索引和表头 df.to_csv(output_file, index=False, header=False)
如果要兼容fileinput(比如处理标准输入),可以将内容转为字符串缓冲区:
import pandas as pd import fileinput from io import StringIO # 读取fileinput内容到缓冲区 content = ''.join(fileinput.input()) df = pd.read_csv(StringIO(content), sep=',', usecols=[0], header=None) df.to_csv(f"{fileinput.filename()}_result.txt", index=False, header=False)
问题原因说明
- fileinput脚本错误:每次循环用
open(..., 'w')打开文件时,'w'模式会强制清空文件原有内容,最终文件仅保留最后一行(甚至因缓存未刷新显示为空)。 - pandas报错原因:
fileinput.input()返回的是逐行迭代器,pd.read_csv无法直接解析,需要转为文件路径、文件对象或字符串缓冲区。
推荐搜索关键词
- Python 命令行接收文件参数
- Python fileinput 写入文件
- pandas read_csv 读取命令行文件
内容的提问来源于stack exchange,提问作者zzz
相关产品推荐
相关产品推荐

