我有一个函数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,但是我认为我正要解决这个问题的方式是错误的。谁能帮我? (我现在只编码了几天,所以如果这个问题真的很基础,我要先道歉)
答案 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])
gen_rand_index
获得文件行的索引readlines()
答案 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