1

我正在创建一个代码,它从 txt 文件中读取信息并将信息存储在三个单独的列表中。我创建的代码就是这样做的,但是是以一种非常硬编码的方式。我的问题是,是否有更好的方法从文件中读取,例如使用 for 循环或任何东西,因为此时的代码正在重复。

我创建的代码是:

def load():
with open("kurser.txt") as share_price_time:
    share_price_list_1 = []
    share_price_list_2 = []
    share_price_list_3 = []
    row_number = 0
    for row in share_price_time:
        if 36 < row_number < 67:
            info_1 = row.strip().split("\t")
            share_price_list_1.append(info_1[1])
        elif 104 < row_number < 135:
            info_2 = row.strip().split("\t")
            share_price_list_2.append(info_2[1])
        elif 172 < row_number < 203:
            info_3 = row.strip().split("\t")
            share_price_list_3.append(info_3[1])
        row_number = row_number + 1

预先感谢您的帮助!

4

3 回答 3

1

您可以使用itertools.islice读取这些连续部分,然后将每一行处理成一个列表,该列表附加到父列表:

from itertools import islice

indices = [(37, 67), (105, 135), (173, 203)]

def load():
   with open("kurser.txt") as share_price_time:
      lst = []
      for st, sp in indices:
         lst.append([r.strip().split("\t")[1] 
                               for r in islice(share_price_time, st, sp)])
         share_price_time.seek(0)

索引列表很容易修改,并且可以很容易地作为函数参数的一部分传递。

于 2017-08-12T13:25:38.030 回答
0

如果 rowcount 是拆分文件的唯一方法,可能是这样的:

share_price_spec = [(37,67), (105,135), (173,203)]
share_price_lists = []

with open("c:\Python\data.txt") as share_price_time:
    test = share_price_time.readlines()
    for price in share_price_spec:
        row_start,row_end = price[0], price[1]
        share_price_lists.append( test[row_start: row_end])

print(share_price_lists)

首先创建一个包含您感兴趣的行块的文件规范。然后将整个文件读入内存(假设文件不是太大)并使用文件规范将文件分成单独的部分。应该易于维护,因为您只需更改文件规范即可读取更多块。我的示例代码中有一些额外的不必要的行,但它值得 IMO 的可读性。

如果您愿意,您可以将 share_price_spec 更改为目录列表或命名切片列表以供将来阅读。

于 2017-08-12T13:45:43.467 回答
0

您可以先读取整个 filr 并存储切片:

with open('kurser.txt') as f:
    x = f.readlines()

a, b, c = x[37:67], x[105:135], x[173:203]

切片配置为[起始位置(包括):结束位置(不包括)]。

在此处查看文档

于 2017-08-12T13:28:58.083 回答