从命令行输入初始化Python对象

时间:2016-07-25 03:52:57

标签: python class input command-line

我是Python新手,正在学习输入/输出。现在,我试图从我从命令行输入指定的文件中向对象添加属性。

例如,我想运行以下内容:$ /...filepath.../ python3 myCode.py < 06以传递文件06的内容

$ /...filepath.../ cat 06
7
4 5 2 7 88 2 1

myCode.pymyCode.py06都位于同一目录中。

我试图通过命令行调用创建一个MyClass对象,其属性如下:

## myCode.py ##

# create class
class MyClass(object):
    def __init__(self):
    self._num_one = int(sys.stdin.readline())    
    self._num_many = [int(x) for x in sys.stdin.readline().split()]

# print attributes
print(MyClass()._num_many)
print(MyClass()._num_one)

但我为ValueError: invalid literal for int() with base 10: ''收到了以下错误self._num_one,但我可以打印self._num_many并且不确定原因。如果我交换self._num_oneself.num_many的顺序,那么我可以获得self._num_one。由于06只有两行,是否有第一行我最初没有读过?为什么我只能打印这两个属性中的一个,以及如何打印这两个属性?

非常感谢。

2 个答案:

答案 0 :(得分:0)

只是因为你的输入流不是int,它是一个带空格的字符串和&#34; \ n&#34;分隔符,你必须先处理这些事情。

快速简便的方法是将代码更改为此类(未经测试):

self._num_one = int("".join(sys.stdin.readline().split()))

答案 1 :(得分:0)

您的代码存在一些问题导致其无法正常工作。

首先,如果您正在逐行读取输入文件,则需要删除之前和之后的空格。这意味着在.strip()之后调用.readline()方法。您收到ValueError因为int()无法处理非数字字符串。

>>> int('x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'x'
>>> int(' ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ' '
>>> int('\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '\n'
>>> int('1')
1

所以代码变成了

class MyClass(object):
    def __init__(self):
        self._num_one = int(sys.stdin.readline().strip())
        self._num_many = [int(x) for x in sys.stdin.readline().strip().split()]

其次,每当你执行MyClass()时,它都会实例化一个新对象。如果我正确理解代码,则期望读取两行两次(总共4行)。给定输入文件,我假设您有兴趣实例化 ONE 对象。因此,我们实例化一个,并将其标记为变量,然后稍后使用该引用。

instantiatedObject = MyClass()
print(instantiatedObject._num_many)
print(instantiatedObject._num_one)