【问题标题】:python: opening text files as lists, and retrieving data with thempython:将文本文件作为列表打开,并用它们检索数据
【发布时间】:2012-10-18 19:39:00
【问题描述】:

我在 python 中打开和使用文本文件作为列表时遇到问题...我需要在一个文本文件(每个 50 个单词)、三个文本文件中使用字符串值...而且我需要使用每个文本文件中的随机单词,以便每次都制造侮辱......(莎士比亚对那些知道的人的侮辱)

  import random #Import my random

Column_picker = random.randint(0, 45) #Define my random between 0-50

with open("Column1.txt") as d:
    insults1 = list(d)

with open("Column2.txt") as f:
    insults2 = list(f)

with open("Column3.txt") as e:
    insults3 = list(e)

print("Thou", insults1[], insults2[], insults3[])

这就是我到目前为止所拥有的,我感觉非常接近我只是无法从列表中获取正确的字符串..它要么获取整个列表,要么只获取其中的一个字母....

【问题讨论】:

  • insults1[] 是什么,无效!
  • 文件在 python 中是可迭代的。除此之外,您希望避免每次运行程序时都打开文件。编写一个命令来打开文本文件并将它们存储在一个变量中,然后将该变量传递给您的程序。
  • 文件中的单词是如何分隔的?每个都在单独的行上吗?

标签: python list random python-3.x


【解决方案1】:

使用random.choice:

import random

def random_word(filename):
    with open(filename) as file:
         return random.choice(file.readlines())

filenames = ["file.txt", "another.txt"]
print("Thou " + ' '.join(map(random_word, filenames)))

如果您需要多次获取线路,也可以使用linecache.getline(filename, line_number)

【讨论】:

  • 爆炸,你的random_word 选择器比我的好。
  • 可能用户想要上述功能,但是如果您想要从所有三个文件中选择相同的随机索引,那么choice 不起作用。我不确定,但我相信choice 只是randint(0,len(x)) 的包装...我通常不喜欢choice 出于这个原因。它不灵活,基本上没有性能或代码/可读性增益。但是我的大部分随机抽样工作都是数字的,在这种情况下我还是使用 NumPy 和 scikits。
  • @EMS -- 我认为random.choice(x)x[randint(0,len(x))] 更容易阅读。它更明确。它几乎读起来像英语——我想从 x 中随机选择一个元素。
  • 但是如果你把它分开:y=randint(0,len(x)); my_choice= x[y] 那么它就同样易于阅读并且在类型方面更加灵活。您可以使用随机索引,而不仅限于从数组中切片的随机对象。
  • @EMS:是的。 “我需要使用每个文本文件中的随机词”可能是模棱两可的。顺便说一句,使用random.choice 的优点之一是您可以避免代码中的一个错误,例如:randint(0, len(x)) 可以产生IndexError
【解决方案2】:

我假设每个侮辱都是文件中的一行,但如果readlines 在第一行以空格分隔,我们可以将它们替换为readlines[0].split(),我们可以添加一点以忽略\n 等。但是思路还是一样的。

import random #Import my random

Column_picker = random.randint(0, 45) #Define my random between 0-50
with open("Column1.txt") as d:
    insults1 = d.readlines()

with open("Column2.txt") as f:
    insults2 = f.readlines()

with open("Column3.txt") as e:
    insults3 = e.readlines()

print("Thou", insults1[Column_picker], insults2[Column_picker], insults3[Column_picker])

【讨论】:

  • 它一直给我错误(索引错误:列表索引超出范围),这可能是我对文本文件的错......除了“词”、“词”、“词”、
  • 您应该发布您的 word 文件内容的样本,以便我们知道它是如何组织的。您可能必须拆分逗号,然后删除引号或其他内容。这完全取决于您的数据的组织方式。
【解决方案3】:

有一个功能肯定更好:

def random_word(fname):
    line_num = random.randint(0, 45)
    with open(fname) as f:
        lines = f.readlines()
    return lines[line_num]

print("Thou",
     random_word("Column1.txt"),
     random_word("Column2.txt"),
     random_word("Column3.txt"))

最后一行甚至可以更简洁一点:

files = ['Column1.txt','Column2.txt','Column3.txt']
insults = [random_word(f) for f in files]
print ( "Thou "+' '.join(insults) )

【讨论】:

  • 如果您希望每个文件的索引相同,则需要将随机调用移出,然后将其传递给函数。
  • @EMS -- 是的。但这似乎没有那么有趣。那么你总共只有 50 次侮辱可以投掷。这样你就有 50**3 次侮辱,这要好得多:)
  • 我同意侮辱越多越好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2020-11-19
相关资源
最近更新 更多