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

如何让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)

问题原因说明

  1. fileinput脚本错误:每次循环用open(..., 'w')打开文件时,'w'模式会强制清空文件原有内容,最终文件仅保留最后一行(甚至因缓存未刷新显示为空)。
  2. pandas报错原因:fileinput.input()返回的是逐行迭代器,pd.read_csv无法直接解析,需要转为文件路径、文件对象或字符串缓冲区。

推荐搜索关键词

  • Python 命令行接收文件参数
  • Python fileinput 写入文件
  • pandas read_csv 读取命令行文件

内容的提问来源于stack exchange,提问作者zzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:28