嗨,我实际上正在处理一个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循环之后的内容。我认为这可能是一个非常基本的错误,但我无法得到它。
有任何帮助吗?
答案 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)