我是Python新手,正在学习输入/输出。现在,我试图从我从命令行输入指定的文件中向对象添加属性。
例如,我想运行以下内容:$ /...filepath.../ python3 myCode.py < 06
以传递文件06
的内容
$ /...filepath.../ cat 06
7
4 5 2 7 88 2 1
到myCode.py
。 myCode.py
和06
都位于同一目录中。
我试图通过命令行调用创建一个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_one
和self.num_many
的顺序,那么我可以获得self._num_one
。由于06
只有两行,是否有第一行我最初没有读过?为什么我只能打印这两个属性中的一个,以及如何打印这两个属性?
非常感谢。
答案 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)