我一直在网上搜索一段时间,似乎找不到任何东西。我基本上学习了几种语言,我只是想用不同的语言重新创建一个程序。
def read_one_file():
f = open('C:\Python27\inventory.dat', 'r')
invid = f.readline()
stock = f.readline()
published = f.readline()
price = f.readline()
invtype = f.readline()
title = f.readline()
author = f.readline()
return invid, stock, published, price, invtype, title, author
read_one_file()
print "Update Number In Stock"
print "----------------------"
print "Item ID: ", invid
基本上我正在尝试读取文件,将数据吸收到变量中然后将这些变量传递给main(类?)。当我归还它们时,它们仍然无法打印。当我在read_one_file之外初始化它们时,它们仍然没有返回正确的东西。
答案 0 :(得分:5)
您需要在某处存储read_one_file()的结果。你真的是什么 使用return语句创建结果元组。然后是你 调用read_one_file时必须解压缩该元组。这是一个例子:
(invid, stock, published, price, invtype, title, author) = read_one_file()
print "Item ID:", invid
这种语法正在执行一种称为“模式匹配”的功能及其功能 分解read_one_file返回的元组并为每个元组命名 元素在里面。我在这里添加了括号以使其更清楚 read_one_file正在返回一个元组,但你可以轻松地编写它 这样:
invid, stock, published, price, invtype, title, author = read_one_file()
这一切都很好,但实际上,这是回归事情的一种坏方法 从你的功能。如果你想要从a返回很多变量 像这样的功能,dict可能是一个更好的方法。还有,你会的 可能想要使用with语句来确保您的文件已关闭并清理 一旦你完成它就适当地完成。这是您的代码的样子 使用该策略:
def read_one_file():
with open('C:\Python27\inventory.dat', 'r') as f:
return dict(invid = f.readline().strip(),
stock = f.readline().strip(),
published = f.readline().strip(),
price = f.readline().strip(),
invtype = f.readline().strip(),
title = f.readline().strip(),
author = f.readline().strip())
results = read_one_file()
print "Update Number In Stock"
print "----------------------"
print "Item ID: ", results['invid']
编辑:我更改了上面的代码以使用.strip(),因为(正如@NiklasB。指出的那样),新行仍然包含在readline中。
答案 1 :(得分:4)
对于您似乎想要做的事情,这有点清洁。注意我假设您的inventory.dat
文件不是很大,并且至少有7行。
def read_one_file(fname=r'C:\Python27\inventory.dat'):
with open(fname) as f:
spam = [line.strip() for line in f.readlines()]
keys = ['invid', 'stock', 'published', 'price', 'invtype', 'title', 'author']
inventory_item = dict(zip(keys, spam[:len(keys)]))
return inventory_item
d = read_one_file()
print "Update Number In Stock"
print "----------------------"
print "Item ID: ", d['invid']
原始代码的更改细分:
fname
作为默认参数传递,而不是硬编码到函数fname
字符串变成带有r前缀的r'raw string'
,这样可以防止错误地处理反斜杠转义(例如,如果您的文件名为ninventory.dat
,则为{{1}作为Windows中的路径分隔符,如果使用普通字符串,则会在文件名中获得换行符)\
是一个列表解析,用于从数据中删除尾随换行符,并将这些行存储在名为[line.strip() for line in f.readlines()]
的列表中。spam
将文件的前n行映射为键的值。 dict
将列表切片到前n个项目,其中n是上面声明的键数。 spam[:len(keys)]
只需将2个迭代(在本例中为键和文件中的值)组合成一个可迭代的元组,这是创建新zip
时可接受的形式之一。 dict
将读取的文件结果存储到变量中。在你的代码中,这是因为没有引用所持有的函数的返回值而丢失。 d = read_one_file()
访问存储在dict d['invid']
中的键'invid'的值。您应该类似地访问其他值。 答案 2 :(得分:1)
这应该有效:
def read_one_file():
f = open('C:\Python27\inventory.dat', 'r')
invid = f.readline()
stock = f.readline()
published = f.readline()
price = f.readline()
invtype = f.readline()
title = f.readline()
author = f.readline()
return invid, stock, published, price, invtype, title, author
invid, stock, published, price, invtype, title, author = read_one_file()
print "Update Number In Stock"
print "----------------------"
print "Item ID: ", invid
基本上,你从函数中返回所谓的变量“元组”并将其分配给主程序中变量的“元组”。他们被命名为同一事实的事实对该计划并不重要。
答案 3 :(得分:1)
另一种选择是在函数调用中传递字典,然后从dict中访问变量:
read_file_dict = {}
def read_one_file(some_dict):
...
some_dict['invid'] = file.readline()
some_dict['stock'] = file.readline()
...
运行功能:
read_one_file(read_file_dict)
然后访问变量(dict条目):
read_file_dict['invid']
答案 4 :(得分:0)
简短的回答:正如其他人所说的那样,你需要打开你要返回的元组,然后才能获得这些值:
invid, stock, published, price, invtype, title, author = read_one_file()
答案很长:这可能有点长,但请耐心等待,因为它是理解各种编程语言如何工作的重要信息。您遇到的问题是了解范围,某些范围内变量的生命周期以及如何在两个不同范围之间传输变量。我将尽力触及其中的每一个,以及它与您的问题的关系。
范围本质上是程序的一部分,您声明的某些变量将存在于该部分中。定义函数时:
def read_one_file():
f = open('C:\Python27\inventory.dat', 'r')
invid = f.readline()
stock = f.readline()
published = f.readline()
price = f.readline()
invtype = f.readline()
title = f.readline()
author = f.readline()
return invid, stock, published, price, invtype, title, author
您定义了范围。变量invid,stock,published,price,invtype,title和author都存在于该函数中,并且一旦该函数终止就不再存在。 Python恰好是范围的可视化器,因为它依赖于空格/制表符。新的缩进级别定义了一个新的范围。
为了从函数范围中获取变量/值,您可以像在函数中一样返回它。但是程序中调用该函数的部分必须在其自己的作用域中指定变量,这些变量将接收函数返回的值。 (要接收数据,请将变量分配给函数的结果:var = function()
)
在您发布的代码中,您调用了read_one_file()
,但没有为其返回的值分配任何变量。当您尝试访问其中一个您认为要返回的值时:
print "Update Number In Stock"
print "----------------------"
print "Item ID: ", invid
invid
在技术上不是read_one_file()
之外的变量,因此会发生错误。
关键是返回的变量不会按名称自动将它们传递给被调用者的范围(调用该函数的代码)。您必须在被调用者中指定一个新变量才能接收返回的值。
希望这会有所帮助:)