鱼C论坛

 找回密码
 立即注册
查看: 2518|回复: 22

[已解决]如何提供文件名作为命令行参数

[复制链接]
发表于 2021-10-30 11:57:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import sys

  2. NUM_LINES = 10

  3. if len(sys.argv) != 2:
  4.     print('Provide the file name as a command line argument.')
  5.     quit()

  6. try:
  7.     inf = open(sys.argv[1], "r")
  8.     line = inf.readline()
  9.     count = 0
  10.     while count < NUM_LINES and line != '':
  11.         line = line.rstrip()
  12.         count += 1
  13.         print(line)
  14.         line = inf.readline()
  15.     inf.close()
  16. except IOError:
  17.     print('An error occurred while accessing the file.')
  18.    
复制代码


程序代码如上,总是运行第六行,想知道怎么样将命令行参数添加到py文件里,是在同一个文件夹下创建一个文本文档还是设置路径?
最佳答案
2021-10-30 15:09:21
1005663861 发表于 2021-10-30 14:55
只能在cmd运行这个程序吗,不能用pycharm进行运行吗


只有从命令行运行(包括创建新进程的方式),才能给你的程序提供命令行参数。
pycharm里有终端,跟cmd是一样效果。

如果你想在pycharm中点击按钮或者右键直接运行,那你的程序完全可以在运行时再用input要求用户输入路径,或者直接把路径写到源代码里,也不是非得接收命令行参数,对不对?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-30 12:11:14 | 显示全部楼层
本帖最后由 kogawananari 于 2021-10-30 12:12 编辑
  1. import sys
  2. from pathlib import Path

  3. print('当前目录是',Path.cwd())

  4. NUM_LINES = 10

  5. if len(sys.argv) != 2:
  6.     print('格式 python文件+空格+文件名')
  7.     quit()

  8. try:
  9.     inf = open(Path.cwd()/Path(sys.argv[1]), "r")
  10.     line = inf.readline()
  11.     count = 0
  12.     while count < NUM_LINES and line != '':
  13.         line = line.rstrip()
  14.         count += 1
  15.         print(line)
  16.         line = inf.readline()
  17.     inf.close()
  18. except IOError:
  19.     print('文件名或路径不对 可以尝试cd到要读取的目标文件所在目录')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 12:21:23 | 显示全部楼层
  1. import sys

  2. NUM_LINES = 10

  3. if len(sys . argv) < 2 :
  4.     print('Provide the file name as a command line argument.')
  5. else:
  6.     try:
  7.         inf = open(sys . argv[1] , 'rt')
  8.         txt = list(inf)
  9.         inf . close()
  10.         m = NUM_LINES if len(txt) > NUM_LINES else len(txt)
  11.         for i in range(m):
  12.             print(txt[i] . rstrip())
  13.     except IOError:
  14.         print('An error occurred while accessing the file.')
复制代码

        运行实况:
  1. D:\00.Excise\Python>python x.py data.txt
  2. 从明天起,做一个幸福的人
  3. 喂马、劈柴,周游世界
  4. 从明天起,关心粮食和蔬菜
  5. 我有一所房子,面朝大海,春暖花开

  6. D:\00.Excise\Python>python x.py xy.txt
  7. An error occurred while accessing the file.

  8. D:\00.Excise\Python>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 12:24:32 | 显示全部楼层
你运行的方式不对,既然你要从命令行提供路径给py文件,那就要从命令行运行它:

在你的源代码目录打开cmd,输入
  1. python 你的源代码.py 你需要处理的文件的文件路径
复制代码

比如
  1. python test.py f:/1/t.txt
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 13:38:15 | 显示全部楼层

我不知道sys.argv所判断的文件储存在哪里
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 13:38:45 | 显示全部楼层
hrpzcf 发表于 2021-10-30 12:24
你运行的方式不对,既然你要从命令行提供路径给py文件,那就要从命令行运行它:

在你的源代码目录打开cmd ...

可以在代码里边标注文件的位置吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 13:57:41 | 显示全部楼层
1005663861 发表于 2021-10-30 13:38
可以在代码里边标注文件的位置吗

你可能还没明白命令行参数是什么意思
比如你在命令行中这样运行你的源代码:
  1. python test.py 123 abc aks23 666
复制代码

那你的源代码中sys.argv的值就是[‘test.py’, '123', 'abc', 'aks23', '666']

又比如你在命令行这样运行你的源代码
  1. python test.py f:/1.txt
复制代码

你的源代码中sys.argv的值就是[‘test.py’, 'f:/1.txt']
里面的
  1. inf = open(sys.argv[1], "r")
复制代码
就相当于
  1. inf = open('f:/1.txt', "r")
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:02:04 | 显示全部楼层

就是我想知道从什么地方可以传入系统命令参数,而这个参数可以是文本文档吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:07:53 | 显示全部楼层
本帖最后由 jackz007 于 2021-10-30 14:11 编辑
1005663861 发表于 2021-10-30 14:02
就是我想知道从什么地方可以传入系统命令参数,而这个参数可以是文本文档吗


        系统命令参数只的是你在启动脚本时,向操作系统提交的命令行,比如:
  1. python x.py abc.txt
复制代码

        那么,len(sys . argv) == 2,sys . argv[0] == 'x.py',sys . argv[1] == 'abc.txt' 这就是命令行的含义。
        你可以用下面的语句把 sys . argv 直接打印出来:
  1. print(sys . argv)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:09:58 | 显示全部楼层
jackz007 发表于 2021-10-30 14:07
系统命令参数只的是你在启动脚本时,向操作系统提交的命令行,比如:

        那么,sys . ar ...

我知道sys.argv的用法,就比如说这个abc.txt, 它是怎么添加到python x.py的扩展名后边,如何添加
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:12:52 | 显示全部楼层
jackz007 发表于 2021-10-30 14:07
系统命令参数只的是你在启动脚本时,向操作系统提交的命令行,比如:

        那么,len(sy ...

现在含义我清楚,每次运行的时候len(sys.argv) == 1,的,就是我不知道将txt文件放在什么地方,会使len(sys.argv) == 2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:13:07 | 显示全部楼层
1005663861 发表于 2021-10-30 14:09
我知道sys.argv的用法,就比如说这个abc.txt, 它是怎么添加到python x.py的扩展名后边,如何添加

          在 CMD 窗口里,通过键盘输入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:15:33 | 显示全部楼层
1005663861 发表于 2021-10-30 14:09
我知道sys.argv的用法,就比如说这个abc.txt, 它是怎么添加到python x.py的扩展名后边,如何添加
在你的源代码目录打开cmd,输入



屏幕截图 2021-10-30 141450.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:15:39 | 显示全部楼层
jackz007 发表于 2021-10-30 14:13
在 CMD 窗口里,通过键盘输入


                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:16:54 | 显示全部楼层
jackz007 发表于 2021-10-30 14:13
在 CMD 窗口里,通过键盘输入


F:\e\python_file\python_exercise>Python p7_149.py p7_149.txt
Traceback (most recent call last):
  File "p7_149.py", line 11, in <module>
    line = inf.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 20: illegal multibyte sequence

是语法格式不对吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:20:35 | 显示全部楼层
1005663861 发表于 2021-10-30 14:16
F:\e\python_file\python_exercise>Python p7_149.py p7_149.txt
Traceback (most recent call last): ...

inf = open(sys.argv[1], "r")改成inf = open(sys.argv[1], "r", encoding="utf-8")
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:26:36 | 显示全部楼层
hrpzcf 发表于 2021-10-30 13:57
你可能还没明白命令行参数是什么意思
比如你在命令行中这样运行你的源代码:

F:\e\python_file\python_exercise>Python p7_149.py p7_149.txt
Traceback (most recent call last):
  File "p7_149.py", line 11, in <module>
    line = inf.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 20: illegal multibyte sequence

我运行了,是这种情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:28:29 | 显示全部楼层
1005663861 发表于 2021-10-30 14:26
F:\e\python_file\python_exercise>Python p7_149.py p7_149.txt
Traceback (most recent call last):
...

看16楼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 14:30:30 | 显示全部楼层

出问题的使cmd不是python
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 14:46:19 | 显示全部楼层
1005663861 发表于 2021-10-30 14:30
出问题的使cmd不是python

你按照16楼改了源代码再试试不就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-18 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表