![](/img/trans.png)
[英]Python 3 - Reading line by line from a textfile and doing action for each line
[英]Reading an nth line of a textfile in python determined from a list
我有一个函数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,但是我认为我正要解决这个问题的方式是错误的。 谁能帮我? (我现在只编码了几天,所以如果这个问题确实很基础,我会提前道歉)
好吧,让我们先解决一些问题
每当您从列表中访问内容时,放在方括号[]
都应为整数,例如: [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
获取文件行的gen_rand_index
readlines()
将整个文件读入内存 您收到的错误是因为您试图使用字符串索引( row
)索引一个字符串变量( line
)。 大概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()
。
我将逐行介绍一些问题。
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
的元素相对应的文件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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.