从列表中读取由Python读取的文本文件的第n行

时间:2019-03-04 22:02:34

标签: python

我有一个函数gen_rand_index,它会以列表格式生成一组随机数字,例如[3,1][3,2,1]

我还有一个文本文件,其内容如下:

  

红色$ 1

     

绿色$ 5

     

蓝色$ 6

我该如何编写一个函数,以便一旦python生成此数字列表,它将自动读取文本文件中的#行?因此,如果生成了[2,1],而不是打印[2,1],我会得到“绿色$ 5,红色$ 1”,也就是文本文件中的第二行和文本文件中的第一行吗?

我知道您可以执行print(line [2])和类似的命令,但这在我的情况下不起作用,因为每次我得到要读取的行的不同随机数时,它不是我想每次阅读的固定行。

row = str(result[gen_rand_index]) #result[gen_rand_index] gives me the random list of numbers
file = open("Foodinventory.txt", 'r')
for line in file:
    print(line[row])
file.close()

到目前为止,我已经拥有了,但是我得到了这个

  

错误:int()以10为底的无效文字:“ [4,1]”

我也得到了

  

TypeError:字符串索引必须为整数

但是我试图用int和其他类似的东西替换str,但是我认为我正要解决这个问题的方式是错误的。谁能帮我? (我现在只编码了几天,所以如果这个问题真的很基础,我要先道歉)

3 个答案:

答案 0 :(得分:0)

好的,首先让我们解决一些问题

每当您从列表中访问内容时,放在方括号[]中的内容都应为整数,例如:[5]。这告诉Python您需要第5个元素。它不能["5"],因为在这种情况下,5将被视为字符串

因此,row = str(result[gen_rand_index])行实际上应该只是row = ...,而无需调用str。这就是为什么出现有关列表索引的TypeError的原因

第二,根据您的描述gen_rand_index将返回数字列表。

那么,为什么不呢?

indices_to_pull = gen_rand_index()
file_handle = open("Foodinventory.txt", 'r')
file_contents = file_handle.readlines() # If the file is small and simle this would work fine
answer = []

for index in indices_to_pull:
    answer.append(file_contents[index-1])

说明

  1. 我们从gen_rand_index获得文件行的索引
  2. 我们使用readlines()
  3. 将整个文件读入内存
  4. 然后我们得到想要的行, Rememebr将列表从0索引时减去1

答案 1 :(得分:0)

您得到的错误是因为您试图使用字符串索引(line)为字符串变量(row)编制索引。大概row将包含类似'[2,3,1]'的内容。

但是,即使row是数字索引,也不会索引您认为要索引的内容。变量line是一个字符串,它包含(在任何给定的迭代中)文件的一行。索引此变量将给您一个字符。例如,如果line包含green $5,则line[2]将产生'e'

您的意图似乎是索引到代表文件所有行的字符串列表。

如果文件不是太大,则可以将整个文件读入行列表,然后索引该数组:

with open('file.txt') as fp:
    lines = fp.readlines()

print(lines[2]).

在这种情况下,lines[2]将产生字符串'blue $6\n'

要丢弃结尾的换行符,请改用lines[2].strip()

答案 2 :(得分:0)

我将逐行介绍一些问题。

row = str(result[gen_rand_index]) #result[gen_rand_index] gives me the random list of numbers

您确定它是gen_rand_index而不是gen_rand_index()吗?如果gen_rand_index是一个函数,则应调用该函数。在您拥有的代码中,您没有在调用函数,而是将函数直接用作索引。

file = open("Foodinventory.txt", 'r')
for line in file:
    print(line[row])
file.close()

用于打开文件并逐行读取的正确python习惯用法是

with open("Foodinventory.txt.", "r") as f:
    for line in f:
        ...

这样,您不必关闭文件; with子句会自动为您完成此操作。

现在,您要做的是打印与变量row中的元素相对应的文件行。因此,您需要一个if语句,该语句检查您刚从文件读取的行号是否与数组row中的行号相对应。

with open("Foodinventory.txt", "r") as f:
    for i, line in enumerate(f):
        if i == row[i]:
            print(line)

但这是错误的:仅当列表元素被排序时,它才有效。您的问题不是这种情况。因此,让我们考虑一下。您可以可以多次遍历文件,并且每次遍历文件时,请打印一行。但这将是低效的:将花费O(nm)的时间,其中n == len(row)且m ==文件中的行数。

更好的解决方案是读取文件的所有行并将其保存到数组中,然后从该数组中打印相应的索引:

arr = []
with open("Foodinventory.txt", "r") as f:
    arr = list(f) 
for i in row:
    print(arr[i - 1]) # arrays are zero-indiced