【问题标题】:For Loop over a list in PythonFor 循环遍历 Python 中的列表
【发布时间】:2021-04-01 23:53:54
【问题描述】:

我有一个 train_file.txt,每行有 3 列。

例如;

1 10 1

1 12 1

2 64 2

6 17 1

...

我正在阅读这个 txt 文件

train_data = open("train_file.txt", 'r').readlines()

然后我尝试使用 for 循环获取每个值

for eachline in train_data:
    uid, lid, x = eachline.strip().split()

问题:训练数据是一个巨大的文件,这就是为什么我只想获取前 1000 行。

我试图执行以下代码,但出现错误('list' 对象不能被解释为整数)

for eachline in range(train_data,1000)
        uid, lid, x = eachline.strip().split()

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    根本不需要读取整个文件。您可以直接在文件上使用enumerate 并提前中断或使用itertools.islice

    from itertools import islice
    
    train_data = list(islice(open("train_file.txt", 'r'), 1000))
    

    您也可以在以后继续使用相同的文件句柄来读取更多数据:

    f = open("train_file.txt", 'r')
    train_data = list(islice(f, 1000)) # reads first 1000
    test_data = list(islice(f, 100))   # reads next 100
    

    【讨论】:

      【解决方案2】:

      也许尝试改变这一行:

      train_data = open("train_file.txt", 'r').readlines()
      

      收件人:

      train_data = open("train_file.txt", 'r').readlines()[:1000]
      

      【讨论】:

        【解决方案3】:

        train_data 是一个列表,使用切片: for eachline in train_data[:1000]:

        由于文件“巨大”,用您的话来说,更好的方法是只读取前 1000 行(readlines() 将读取内存中的整个文件)

        with open("train_file.txt", 'r'):
            train_data = []
            for idx, line in enumerate(f, start=1):
                train_data.append(line.strip.split())
                if idx == 1000:
                    break
        

        请注意,数据将是 str,而不是 int。您可能希望将它们转换为 int

        【讨论】:

          【解决方案4】:

          你可以使用 enumerate 和 break:

          for k, line in enumerate(lines):
              if k > 1000: 
                  break # exit the loop
          
              # do stuff on the line
          

          【讨论】:

            【解决方案5】:

            我建议使用csv 内置库,因为数据类似于 csv(或者如果您正在使用它,则使用 pandas 数据),并使用with。所以是这样的:

            import csv
            from itertools import islice
            
            with open('./test.csv', 'r') as input_file:
              csv_reader = csv.reader(input_file, delimiter=' ')
              rows = list(islice(csv_reader, 1000))
            
            # Use rows
            print(rows)
            

            您现在不需要它,但它会使转义字符或多行条目更易于解析。此外,如果有标题,您可以使用 csv.DictReader 来包含它们。

            关于您的原始代码:

            • 调用readlines() 将读取此时的所有行,因此之后进行任何过滤都不会产生影响。
            • 如果您确实是这样阅读的,要获得前 1000 行,您的 for 循环应该是:
            for eachline in traindata[:1000]:
              ...
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-02-05
              • 1970-01-01
              • 1970-01-01
              • 2019-01-15
              • 2016-04-14
              • 1970-01-01
              • 2015-10-30
              相关资源
              最近更新 更多