2017-06-05 126 views
1

我找不到为什么我的下面的代码不会为for循环中的第n行分配一个新值。据我所知,我对b矩阵进行索引的方式应该是正确的,但似乎count变量不会为每次迭代更新。打印语句仅用于检查发生了什么。为for循环python中的行赋值

我认为这很简单,所以我很高兴如果有人能指出我是错的。

#!/usr/bin/python 
import sys 
#from string import maketrans 
#import re 
import numpy as np 

lines = sum(1 for line in sys.stdin) 
b = np.zeros((lines,2)) 

count = 0 
for line in sys.stdin: 

    line = line.strip() 
    myline = line.split(",") 

    Depart = myline[3] 
    DepartDelay = float(myline[6]) 

    if DepartDelay<0: 

     DepartDelay=0 

    b[count,0] = Depart 
    b[count, 1] = DepartDelay 

    count = count + 1 
    print(count) 
print(b) 
print(count)  

我使用以下命令来执行Ubuntu终端内的代码。

cat sample.txt | mapper.py 

这就是为什么没有指定任何数据/文本文件。

提前,谢谢!

回答

0

sys.stdin基本上是一个文件对象,所以这只是我的意见,并不像做for line in sys.stdin(它可能在技术上的工作,但它的坏的形式。另外,你还有其他的问题,所有的提前)

我宁愿叫上sys.stdin read()readlines()方法来读取其中的内容

熟悉标准输入这里的基本知识:How do you read from stdin in Python?

一个循环,会为你的工作应该是这样的:

lines = sys.stdin.readlines() 
for line in lines: 
    do_something(line) 

但要小心,如果你遍历在程序开始时,整个标准输入(当你做了lines = sum(1 for line in sys.stdin)),你不能简单地重新开始迭代

一个更简单的方法,你将是阅读所有的线路如上面提到的,但如果你需要线的长度,你可以简单地这样做第一:

count_lines = len(lines) 

总结,你的程序的启动应该是这样的:

lines = sys.stdin.readlines() 
b = [] 
count = 0 
for line in lines: 
    Depart, DepartDelay = do_something(line) 
    b.append([Depart, DepartDelay]) 

编辑:我wouldnt使用numpy的在所有的多种类型存储(float和string)这样一个简单的问题

+0

谢谢您的回复! 我会实施您的修改以使我的代码更加流畅。 但是,请你让我知道这将如何解决我最初的问题? –

+0

当然,但你必须更具体 - 给出一个期望的输出的例子,你会得到什么?有没有错误或者只是出乎意料的行为?如果你想要一个解决方案,定义你的问题 –

+2

你完全可以[迭代文本文件](https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects),它是鼓励清晰和高效(readline强制将整个文件加载到内存中)。唯一要记住的是它们是可迭代的,而不是序列,所以你可能没有机会倒带或重读。 –

0

的核心问题似乎是,你从sys.stdin两次读取。一旦进入参数sum,它将读取整个输入,然后再次进入for循环。由于文件具有当前位置,通常的结果是for循环无法处理。标准输入也可能是一个流,所以不能倒带。您只能加载一次数据。

第二个问题是如果您可以使用更高的抽象级别加载数据。看起来你正在阅读一个CSV文件,其中csv.reader可能有用,但是它被收集在一个numpy数组中,这使得numpy.loadtxt更具吸引力。它甚至有一个usecols字段来读取特定列。

使用for count, line in enumerate(sys.stdin):也可以更容易处理count变量。这将随着线条的阅读而增加。

我想一个体面的出发点是一样的东西:

b = np.loadtxt(sys.stdin, delimiter=',', usecols=(3,6)) 
b[:,1] = np.maximum(b[:,1], 0) # Set no lower than 0