我试图在python中导入一组列表,并从其中一个列表中调用一个随机项


#Set of lists I want to import into my python program called "setlist.txt"
---------------------------------------------------------------------------------------------
Tripolee = ('Saeed Younan', 'Matrixxman', 'Pete Tong', 'Dubfire', 'John Digweed', 'Carl Cox')
Ranch = ('Dabin', 'Galantis', 'Borgeous', 'Shpongle', 'ODESZA', 'Kaskade')
Sherwood = ('Nadus', 'Mr. Carmack', 'Wave Racer', 'Lido', 'Goldlink', 'Four Tet', 'Flume')
Jubilee = ('Chaz French', 'MartyParty', 'Sango', 'Brodinski', 'Phutureprimitive', 'EOTO')
The Hangar = ('Vourteque', 'The Gentlemen Callers', 'Bart&Baker', 'Jaga Jazzist', 'JPOD')
Forest = ('Vibe Street', 'Lafa Taylor', 'Vaski', 'Little People', 'jackLNDN', 'MartyParty')
---------------------------------------------------------------------------------------------
#program
from sys import exit
from random import randint
from sys import argv
script, setlist = argv
setlist = open(setlist)
print "Here is the setlist for day 1"
print setlist.read()
print "%r is playing on the Tripolee stage" % random.choice(setlist.readline(2))

在这一切之间,我还有一堆代码,我没有在这里写出来,但基本上是最后一行我遇到的问题。

可能不是文件的最佳格式,但您可以拆分并使用ast.literal_eval:

from ast import literal_eval
with open("in.txt") as f:
    choices = [literal_eval(line.split(" = ")[-1]) for line in f]

这将给你一个元组列表,你可以将其传递给random.choice:

[('Saeed Younan', 'Matrixxman', 'Pete Tong', 'Dubfire', 'John Digweed', 'Carl Cox'), ('Dabin', 'Galantis', 'Borgeous', 'Shpongle', 'ODESZA', 'Kaskade'), ('Nadus', 'Mr. Carmack', 'Wave Racer', 'Lido', 'Goldlink', 'Four Tet', 'Flume'), ('Chaz French', 'MartyParty', 'Sango', 'Brodinski', 'Phutureprimitive', 'EOTO'), ('Vourteque', 'The Gentlemen Callers', 'Bart&Baker', 'Jaga Jazzist', 'JPOD'), ('Vibe Street', 'Lafa Taylor', 'Vaski', 'Little People', 'jackLNDN', 'MartyParty')]

我不知道setlist应该来自哪里,您的文件看起来像元组赋值。setlist.readline(2)将读取2个字节,或者在您的情况下实际上什么都不读取,因为您已经耗尽了调用read的文件迭代器。

我建议在使用literal_eval提取后,将文件放在更可用的格式中,也许可以使用名称作为密钥创建一个dict并转储dict。

from ast import literal_eval
with open("in.txt") as f:
    choices = {}
    for line in f:
        ven, tpl = line.split(" = ")
        choices[ven] = literal_eval(tpl)
    print(choices)

输出:

{'Jubilee': ('Chaz French', 'MartyParty', 'Sango', 'Brodinski', 'Phutureprimitive', 'EOTO'), 'Tripolee': ('Saeed Younan', 'Matrixxman', 'Pete Tong', 'Dubfire', 'John Digweed', 'Carl Cox'), 'The Hangar': ('Vourteque', 'The Gentlemen Callers', 'Bart&Baker', 'Jaga Jazzist', 'JPOD'), 'Ranch': ('Dabin', 'Galantis', 'Borgeous', 'Shpongle', 'ODESZA', 'Kaskade'), 'Sherwood': ('Nadus', 'Mr. Carmack', 'Wave Racer', 'Lido', 'Goldlink', 'Four Tet', 'Flume'), 'Forest': ('Vibe Street', 'Lafa Taylor', 'Vaski', 'Little People', 'jackLNDN', 'MartyParty')}

您可以使用json.dumppickle模块来持久化dict,这样每次数据的格式都会简单得多。

为了更清楚一点,下面是你的.txt文件的内容:

---------------------------------------------------------------------------------------------
Tripolee = ('Saeed Younan', 'Matrixxman', 'Pete Tong', 'Dubfire', 'John Digweed', 'Carl Cox')
Ranch = ('Dabin', 'Galantis', 'Borgeous', 'Shpongle', 'ODESZA', 'Kaskade')
Sherwood = ('Nadus', 'Mr. Carmack', 'Wave Racer', 'Lido', 'Goldlink', 'Four Tet', 'Flume')
Jubilee = ('Chaz French', 'MartyParty', 'Sango', 'Brodinski', 'Phutureprimitive', 'EOTO')
The Hangar = ('Vourteque', 'The Gentlemen Callers', 'Bart&Baker', 'Jaga Jazzist', 'JPOD')
Forest = ('Vibe Street', 'Lafa Taylor', 'Vaski', 'Little People', 'jackLNDN', 'MartyParty')

要打印场地和集合列表,您可以使用dict.items:

for ven, set_l in choices.items():
    print("Set list for {}: {}".format(ven, ", ".join(set_l)))

输出:

Set list for Jubilee:  Chaz French, MartyParty, Sango, Brodinski, Phutureprimitive, EOTO
Set list for Tripolee:  Saeed Younan, Matrixxman, Pete Tong, Dubfire, John Digweed, Carl Cox
Set list for The Hangar:  Vourteque, The Gentlemen Callers, Bart&Baker, Jaga Jazzist, JPOD
Set list for Ranch:  Dabin, Galantis, Borgeous, Shpongle, ODESZA, Kaskade
Set list for Sherwood:  Nadus, Mr. Carmack, Wave Racer, Lido, Goldlink, Four Tet, Flume
Set list for Forest:  Vibe Street, Lafa Taylor, Vaski, Little People, jackLNDN, MartyParty

当您打开文件并调用read时,现在文件中的所有内容都存储为字符串。然后打印字符串,接下来尝试random.choice(setlist.readline(2))readline(2)正在尝试读取两个字节,但它甚至无法读取,因为文件指针位于文件的末尾,因为您已经调用了read,所以您看到输出了一个空字符串。

如果您想从第一个元组中获得一个随机字符串:

choices = [literal_eval(line.split(" = ")[-1]) for line in f]
from random import choice
print(choice(choices[0]))

最新更新