繁体   English   中英

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

[英]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])

说明

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

您收到的错误是因为您试图使用字符串索引( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM