Python-CSV-Reader-For循环读取行,但不到达文件末尾

Python-CSV-Reader-For循环读取行,但不到达文件末尾,python,csv,eof,Python,Csv,Eof,我已经开发了一个函数来聚合每个给定队列的总人口,在一个文件中给出。此函数当前使用两次。一次得到总[实际]人口,一次得到“病例”总数。 我遇到了一个问题,函数没有读取到“cases”文件的末尾。我实现了一个行计数器,它打印迭代通过的行数。人口文件计数器输出为933,案例文件计数器输出为911,这意味着它没有读取底部22个案例。有人知道为什么会这样吗 以下是我定义的函数: def newPopCount(filename, fileheader): rowCount = 0 # Row c

我已经开发了一个函数来聚合每个给定队列的总人口,在一个文件中给出。此函数当前使用两次。一次得到总[实际]人口,一次得到“病例”总数。 我遇到了一个问题,函数没有读取到“cases”文件的末尾。我实现了一个行计数器,它打印迭代通过的行数。人口文件计数器输出为933,案例文件计数器输出为911,这意味着它没有读取底部22个案例。有人知道为什么会这样吗

以下是我定义的函数:

def newPopCount(filename, fileheader):
    rowCount = 0  # Row counter
    import csv
    popholder = []
    cohorts = []
    print (len(fileheader))
    for i in range(3, len(fileheader)):
        cohorts.append(fileheader[i])
    for i in range(len(cohorts)):
        popholder.append(0)

    popcsv = open(filename, 'r', newline = '')
    popreader = csv.reader(popcsv, delimiter = ',')

    for row in popreader:
        rowCount += 1
        counter = 0
        if row[0] == fileheader[0]:
            continue
        else:
            for i in range(3, len(fileheader)):
                popholder[counter] += int(row[i])
                counter += 1

    popcsv.close()  

    print (rowCount)  # Print row counter
    return popholder
顺便说一句:
fileheader
是从另一个函数获得的,与它听起来的一样——文件的头。此外,索引从
3
开始,因为文件中的第一个条目是zipcode、x坐标和y坐标

如果有人有任何想法,请分享

这是一个新的案例文件,它的数据被正确地用逗号分隔。还有第二个文件,其中包含数据原始状态的示例。此数据在主函数调用中聚合,该调用生成我们实际讨论的文件:

我还决定包含用于获取标题的代码。我通常通过设置一个等于它的变量来调用它:
thisHeader=getHeader('Cases.csv')
,然后调用另一个函数
casecord=newPopCount('Cases.csv',thisHeader)

下面是
getHeader
函数:

`def getHeader(file):
    import csv
    headername = None
    charList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '+', "'", '"', '{', '}', '[', ']', '?', '.', ',', '<', '>', '/', '~', '`', '-', '_']
    headercsv = open(file, 'r', newline = '')
    headerreader = csv.reader(headercsv, delimiter = ',')
    for row in headerreader:
        if row[0][0] in charList and row[1][0] in charList:
            headername = row
    headercsv.close()
    return headername`
`def getHeader(文件):
导入csv
headername=无
字符表=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','v','w','w','x','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','s','t','u','v','w','w','x','y','z','!'!',','、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'、'', '[', ']', '?', '.', ',', '', '/', '~', '`', '-', '_']
headercsv=open(文件'r',换行符='')
headerreader=csv.reader(headercsv,分隔符=',')
对于headerreader中的行:
如果charList中的[0][0]行和charList中的[1][0]行:
headername=行
headercsv.close()
返回头部名称`

再次感谢您的关注!

我下载了您的要点并将其保存为
cases.tsv

然后我修改了您的
newPopCount
,在
打开文件后立即执行
popcv.readline()
,并将下一行更改为使用
分隔符='\t'
而不是
分隔符=','

然后我用这行代码运行它:

h = newPopCount('cases.tsv', ['zcta', 'xcoord', 'ycoord', 'm5064', 'm6574', 'm75plus', 'f5064', 'f6574', 'f75plus'])
它打印了932页

因为共有933行,其中一行是标题(未计算),这是正确的答案

所以,我猜你只是在错误的文件上运行了它,这就是为什么你得到了错误的答案


您的代码中存在错误并非不可能,而您上载的错误示例数据恰好正好与该错误相对应……但这似乎不太可能。如果您能给我们实际的文件,以及在该文件上实际运行的代码,以及调用
newPopCount
函数的代码,那么规则应该很简单可能性排除。

这并不是对你问题的回答——所以我将把它改成CW——但你可能会对这个库感兴趣。它使处理表格数据比其他方式有趣得多

首先读取数据(我在这里使用您的
NewCaseFile
,它看起来是逗号分隔的,所以我称之为
ncf.csv
):

按列求和:

>>> df.sum()
m5064       981
m6574      1243
m75plus    2845
f5064      1355
f6574      1390
f75plus    1938
total      9752
dtype: int64
尤其是,它使得进行许多简单易懂但在实践中令人恼火的转换变得更加容易。例如:

>>> df = pd.read_csv("ncf.csv")
>>> d2 = pd.melt(df, id_vars=list(df.columns[:3]))
>>> d2["sex"] = d2["variable"].str[:1]
>>> d2["age_lower"] = d2["variable"].str[1:3].astype(float)
>>> d2["age_upper"] = d2["variable"].str[3:].replace("plus", 100).astype(float)
>>> del d2["variable"]
>>> d2.rename(columns={"value": "count"}, inplace=True)
给出:

>>> d2.head()
    zcta    xcoord   ycoord  count sex  age_lower  age_upper
0  51062  211253.4  4733175      0   m         50         64
1  51011  212255.6  4757939      0   m         50         64
2  51109  215303.5  4721048      0   m         50         64
3  51001  215651.1  4746655      1   m         50         64
4  51103  216887.7  4713568      4   m         50         64
>>> d2.groupby("sex")["count"].sum()
sex
f      4683
m      5069
Name: count, dtype: int64

等等。

首先感谢大家考虑了他的问题并试图帮助我。在回答@abarnert的问题时发现,我忘记了在创建此聚合文件(
NewCaseFile.csv
)后关闭它。因此,在添加
后,关闭()
语句,一切都开始正常工作。感谢大家抽出时间来查看我的问题。

显示程序失败的文件。@Patashu ok,我将创建一个I摘要。1秒。添加到postAlso的底部,如何将文本设置为蓝色/红色?用于循环计数
枚举()
可用。感谢您这么做。我编辑了我的文章并创建了一个新的要点。新要点有两个文件。正确分隔的数据,以及数据最初外观的示例(原始文件)。主函数调用为每个队列聚合此数据,创建一个文件,并将聚合数据写入此新文件。我意识到我最初应该包含此信息,因为创建此文件的代码可能有问题。如果您想要此代码,请让我知道。但我一次只考虑一件事。T再次感谢汉克斯花时间!这真是太棒了。谢谢你分享。我实际上刚刚收到一本名为《数据分析的Python》的书,但还没有读完(它涉及很多熊猫和numpy)。非常感谢你发布这本书!
>>> df = pd.read_csv("ncf.csv")
>>> d2 = pd.melt(df, id_vars=list(df.columns[:3]))
>>> d2["sex"] = d2["variable"].str[:1]
>>> d2["age_lower"] = d2["variable"].str[1:3].astype(float)
>>> d2["age_upper"] = d2["variable"].str[3:].replace("plus", 100).astype(float)
>>> del d2["variable"]
>>> d2.rename(columns={"value": "count"}, inplace=True)
>>> d2.head()
    zcta    xcoord   ycoord  count sex  age_lower  age_upper
0  51062  211253.4  4733175      0   m         50         64
1  51011  212255.6  4757939      0   m         50         64
2  51109  215303.5  4721048      0   m         50         64
3  51001  215651.1  4746655      1   m         50         64
4  51103  216887.7  4713568      4   m         50         64
>>> d2.groupby("sex")["count"].sum()
sex
f      4683
m      5069
Name: count, dtype: int64