为什么第二个循环从未执行过?

时间:2018-05-30 13:08:34

标签: python

嗨,我实际上正在处理一个python程序,我需要读取一个csv文件并使用data.append(line)来填充数据数组。

我写了以下部分程序:

print "Lecture du fichier", table1
lecfi = csv.reader(open(table1,'r'),skipinitialspace = 'true',delimiter='\t')
# delimiter = caractere utilisé pour séparer les différentes valeurs

tempSize = 0
tempLast = ""
oldSize = 0
#on initialise la taille du fichier et la derniere ligne du fichier 
if os.path.exists(newFilePath):
    tempSize = os.path.getsize(newFilePath) 
else:
    tempSize = 0
if os.path.exists(newFilePath) and tempSize != 0:
    #Si le fichier tampon n'existe pas, on le créer
    #Lecture du fichier tampon      
    lecofi = csv.reader(open(newFilePath,'r'),skipinitialspace = 'true',delimiter='\t')             
    csvFileArray = []
    for lo in lecofi:
        csvFileArray.append(lo)
    tempLast = str(csvFileArray[0])
    tempLast = tempLast[2:-2]
    oldSize = csvFileArray[1]               
    print "Tempon de Last : ", tempLast
    print "Taille du fichier : ", str(oldSize)   
    #on récupere la ligne représentant la derniere ligne de l'ancien fichier
else:
    #si le fichier n'existe pas, on lui laisse cette valeur par défaut pour le traitement suivant
        tempLast = None

    # remplissage des données du fichier pulse dans la variable data
cpt = 0
indLast = 0
fileSize = os.path.getsize(table1)
if oldSize != fileSize:
    for lecline in lecfi:
        cpt = cpt + 1
        last = str(lecline)
        if tempLast != None and last == tempLast:
            print "TEMPLAST != NONE", cpt
            indLast = cpt
            print "Indice de la derniere ligne : ", indLast
    print last, tempLast
    print "Variable indLast : ", indLast
    i = 0
    for co in lecfi:
        print "\nCOOOOOOO : ", co
        if i == indLast:
            data.append(co[0])
        i=i+1
    for da in data:
        print "\n Variable data : ", da

现在看看印刷品:

Lecture du fichier Data_Q1/2018-05-23/2018-5-23_13-1-35_P_HOURS_Q1
Tempon de Last :  ['(2104.72652']
Taille du fichier :  ['20840448']
TEMPLAST != NONE 317127
Indice de la derniere ligne :  317127
['(2104.72652'] ['(2104.72652']
Variable indLast :  317127

似乎程序并不关心我的for循环之后的内容。我认为这可能是一个非常基本的错误,但我无法得到它。

有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

您尝试迭代CSV两次而不重置它。这就是数据数组为空的原因。

第一次实际迭代文件时:

for lecline in lecfi:

第二次,原始迭代器已经到达它并且为空:

for co in lecfi:

如Johnny Mopp的评论所述,一种可能的解决方案是使用以下方法:

Python csv.reader: How do I return to the top of the file?

希望这能解释您的问题。

答案 1 :(得分:1)

下面:

for lecline in lecfi:
    cpt = cpt + 1
    # ...

您正在阅读整个文件。在这个循环之后,文件指针位于文件的末尾,并且不再需要读取。因此在这里:

i = 0
for co in lecfi:
    # ...

确实从未执行过第二个循环。您需要重置文件指针,或者关闭并重新打开文件,或者从一开始就在list右侧读取它,然后重复遍历此列表。

FWIW,请注意,打开文件而不关闭它们是不好的做法,可能会导致文件损坏(在您的情况下没有那么多,因为您只是阅读但......)。正确的实现方式如下:

with open(table1) as tablefile:
    lecfi = csv.reader(tablefile, ....)

    for lecline in lecfi:
       # ....

    tablefile.seek(0)
    for lecline in lecfi:
       # ....

另外,这个:

lecofi = csv.reader(open(newFilePath,'r'),skipinitialspace = 'true',delimiter='\t')             
csvFileArray = []
for lo in lecofi:
    csvFileArray.append(lo)

会更好地重写为:

with open(newFilePath) as newFile:
   lecofi = csv.reader(newFile, ...)
   csvFileArray = list(lecofi)