Python 使用其他职能部门的数据

Python 使用其他职能部门的数据,python,function,scope,nameerror,hexdump,Python,Function,Scope,Nameerror,Hexdump,我不知道我做错了什么。main函数工作正常,但将数据追加/写入.txt文件函数不起作用。我不断得到“名称错误:名称‘数据’未定义”。我猜这是个范围问题 问题:如何运行main函数,然后将输出写入文件?如何访问主函数的输出,以便在其上运行其他函数 请帮忙,谢谢你 import sys, os print("\n-------------------------- String HexDump ------------------------------------\n") def main(

我不知道我做错了什么。main函数工作正常,但将数据追加/写入.txt文件函数不起作用。我不断得到“名称错误:名称‘数据’未定义”。我猜这是个范围问题

问题:如何运行main函数,然后将输出写入文件?如何访问主函数的输出,以便在其上运行其他函数

请帮忙,谢谢你

import sys, os

print("\n-------------------------- String HexDump ------------------------------------\n")


def main():
    try:
        with open(sys.argv[1], 'rb') as file:
            for line in range(0, os.path.getsize(sys.argv[1]), 60):
                data = file.read(60)
                data = str(data)
                print(data)
    except:
        print('Usage: {} <filename>'.format(os.path.basename(sys.argv[0])))


str = lambda data: ''.join(31 < i < 127 and chr(i) or '.' for i in data)


if __name__ == '__main__':
    main()



def HexStrFileDump():
    with open('HEXDUMPFILE2.txt','wb') as HexFile:
        HexFile.write(data)

HexStrFileDump()
导入系统,操作系统 打印(“\n------------------------------------字符串hextdump--------------------------------------------\n”) def main(): 尝试: 打开(sys.argv[1],“rb”)作为文件: 对于范围(0,os.path.getsize(sys.argv[1]),60)中的行: data=file.read(60) 数据=str(数据) 打印(数据) 除: print('Usage:{}.format(os.path.basename(sys.argv[0])) str=lambda数据:“”。连接(数据中的i为31您正在以不正确的顺序调用所有函数,并且使用不存在(
数据)且超出范围的变量

如果您使用
main()
,则将所有代码集中在此处和子函数中,最佳做法是不要四处传播

错误源于不正确使用HexFile.write(data)
:data是lambda的名称,而不是结果所在的位置

下面是我在5分钟内为这个答案编写的一个合适的文件转储程序:

import sys

def main():
    print("\n-------------------------- String HexDump ------------------------------------\n")
    try:
        with open(sys.argv[1], 'rb') as file:
            i = 0; clear = ""
            for char in file.read():
                if char > 0x19 and char < 0x7f:
                    clear = clear + chr(char)
                else:
                    clear = clear + "?"
                if i % 4 == 0 and i != 0:
                    clear = clear + " "
                    sys.stdout.write(" ")
                if i % 16 == 0 and i != 0:
                    sys.stdout.write(clear+"\n")
                    clear = ""
                    i = 0
                sys.stdout.write("%02X" % char)
                i += 1
            if i % 16 != 0:
                sys.stdout.write(" "+clear+"\n")
    except:
        raise
        print('Usage: {} <filename>'.format(os.path.basename(sys.argv[0])))


if __name__ == '__main__':
    main()
导入系统 def main(): 打印(“\n------------------------------------字符串hextdump--------------------------------------------\n”) 尝试: 打开(sys.argv[1],“rb”)作为文件: i=0;clear=“” 对于file.read()中的字符: 如果char>0x19且char<0x7f: 清除=清除+chr(字符) 其他: 清除=清除+“?” 如果i%4==0且i!=0: 清除=清除+“” sys.stdout.write(“”) 如果i%16==0且i!=0: 系统标准输出写入(清除+“\n”) clear=“” i=0 sys.stdout.write(“%02X”%char) i+=1 如果我是%16!=0: sys.stdout.write(“+clear+”\n”) 除: 提升 print('Usage:{}.format(os.path.basename(sys.argv[0])) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main()
您真的应该发布堆栈跟踪,这样我们就可以看到错误的来源,但您很幸运,在这个程序中只有一个地方会导致您描述的错误

def HexStrFileDump():
    with open('HEXDUMPFILE2.txt','wb') as HexFile:
        HexFile.write(data)
                      ^
在代码中的该点,未定义变量
data
。它必须在函数之前或在模块级别为其分配一些值,但您尚未这样做


main()
中有一个
data
变量,但该变量仅存在于
main()
中,在调用
str
的lambda函数中也有一个不同的
data
变量,但同样,该变量仅存在于该函数中。就
HexStrFileDump()
中的代码而言,其他
数据
变量不存在,这就是为什么它抱怨
数据
没有定义。

数据
应该是模块的全局变量。现在,
data
main
函数中的一个局部变量。使用函数开头的
global
关键字将全局变量导入函数。您可以读取全局变量,而无需使用
global
,但在为其赋值时则不能。请参阅,您应该从main()返回“data”并将其传递给HexStrFileDump()。使用全局变量是一个不好的选择。在我看来,这并不能很好地解释询问者为什么会看到他们收到的错误。感谢您的反馈,我试图更具体地说明在他的代码中不正确地使用数据。好的,这就是我的观点。我在主函数中添加了“全局数据”和“返回数据”。现在,当我运行它时,它确实会写入文件,但是,它只写入第一行数据。我没能把所有的东西都写进这个文件。对我来说,似乎我现在可以访问添加的全局变量的数据,还是我仍然错了?原谅我,我还在学习@大卫Z