ошибка при запуске сценария Python с ООП - PullRequest
0 голосов
/ 06 мая 2019

У меня есть двоичный файл с именем "infile.bin". Я хочу создать программу и немного изменить файл (входной файл со значением каждого байта, увеличенным на единицу), а затем сделать outfile. Для этого я сделал следующий скрипт на python:

import sys

class assignment():

    def __init__(self, infile, outfile):
        if not infile.endswith('.bin'):
            raise NameError("file should have '.bin' extension")
        self.infile = infile
        self.outfile = outfile

    def read_infile(self):
        with open(self.infile, "rb") as bin_in_file:
            data = bin_in_file.read()
        return data

    def increment_write(self):
        with open(self.outfile, "wb") as bin_out_file:
            bin_out_file.write(bytes(item + 1 for item in data))


infile = sys.argv[1]
outfile = sys.argv[2]
main = assignment(infile, outfile).read_infile()
main2 = assignment(infile, outfile).increment_write()

print main
print main2

чтобы запустить его с помощью этой простой команды

python program.py infile.bin out.bin

но когда я запускаю скрипт, он выдает эту ошибку:

Traceback (most recent call last):
  File "program.py", line 24, in <module>
    main2 = assignment(infile, outfile).increment_write()
  File "program.py", line 18, in increment_write
    bin_out_file.write(bytes(item + 1 for item in data))
NameError: global name 'data' is not defined

а там нет "out.bin" вы знаете как это исправить?

1 Ответ

0 голосов
/ 06 мая 2019

Это похоже на то, как в Java (или любом другом языке ООП) вызывается конструктор класса, который требует аргументов, без каких-либо аргументов. Конечно, это не сработает - но это то, что вы делаете, когда делаете assignment().read_infile() - вы создаете новый объект класса assignment, вызывая конструктор __init__ без аргументов (кроме self) и затем вызов read_infile() для полученного объекта.

Итак, вам нужно прочитать файл из командной строки и передать его конструктору:

import sys
...
infile = sys.argv[1]  # refers to the second command-line argument, which would be "infile.bin"
outfile = "some_other_file.bin"
main = assignment(infile, outfile).read_infile()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...