Python - CSV模块,从文件获取信息

时间:2013-03-31 18:53:55

标签: search csv iteration

情况如下:

我遇到的第一个问题是从CSV文件中获取信息。我正在编写的代码的目的是获取大量有关ZCTA(邮政编码)的信息,用于许多不同的同类群组(目前有六种目前正在使用,但代码是灵活的,可以有任意数量的队列)。一个文件包含每个ZCTA的群组。对于每个ZCTA,另一个文件具有每个群组的“病例”(观察到癌症的病例)的数量。另一份文件的每个队列的粗略率,对于爱荷华州(本研究的重点),人们可以“预期”通过队列“看到”人口癌症人数的比率。还有其他一些文件,但这些都是重点,因为这是展示我的问题的地方。

我的代码最初的作用是读取填充文件并通过ZCTA获取每个群组的人口。每个ZCTA和信息都存储在一个列表中,然后列表存储在包含所有ZCTA的列表(嵌套)列表中。然后代码获得原始利率。然后,对于每个ZCTA,将原始速率乘以适当的队列,并与每个ZCTA内的所有其他队列相加,以得到每个ZCTA我们可以预期患有癌症的总人数。人口也总结了。此信息存储在另一个列表中,以及包含所有ZCTA的列表中。这些信息将成为焦点(所有ZCTA的清单,每个ZCTA包含总人口和预期病例总数)。

所以,问题是我需要获取这个新获得的列表并获取OBSERVED个案的数量,对于每个队列,将它们加在一起,将其附加到适当的ZCTA并将其写入新文件。我已经实现了这样做的代码,除了底部22个左右的ZCTA没有得到观察到的案例数量。我不知道它是代码还是什么,但它适用于所有其他906,但不会得到底部22。

读者可以在Gist找到我讨论过的文件(观察到的案例文件和输出文件)的样本数据

以下是我正在使用的代码:

`expectedcsv = open('ExpectedCases.csv', 'w',  newline= '')
expectedwriter = csv.writer(expectedcsv, delimiter = ',')
expectedHeader = ['zcta', 'expected', 'pop', 'observed']
thecasesreader = csv.reader(thecasescsv, delimiter = ',')
for zcta in zctaPop:
   caseCounter = 0
   thecasescsv = open('NewCaseFile.csv', 'r', newline = '')
   thecasesreader = csv.reader(thecasescsv, delimiter = ',')
   for case in thecasesreader:
      if case[0] == zcta[0]:
         for i in range(3, len(case)):
            caseCounter += int(case[i])
   zcta.append(caseCounter)
   expectedwriter.writerow(zcta)
expectedcsv.close()
thecasescsv.close()`

我还想提出的其他事情是,稍后在代码中,所有这一切的实际目的是为每个网格点创建一个SMR过滤器。它们在爱荷华州的整个状态下(通过坐标)放置了一些网格点。 SMR是观察到的数量除以预期病例数。阈值,即特定过滤器的预期案例数,由用户设置。因此,如果用户想要在150个预期情况下创建过滤器(对于每个网格点),则代码将遍历每个ZCTA,总结预期情况,直到找到大于150个。到最后一个ZCTA的距离是过滤器的“半径”。

为此,我建立了一个距离矩阵(从每个网格点到每个ZCTA的距离),然后对它进行排序,最接近最远。由于文件的大小(2300 X 930),我必须逐行读取此文件并从其他文件中获取所有信息。因此,从最近的ZCTA开始,我得到人口,预期案例和观察到的案例(上面讨论了这个文件的问题)并将它们分别添加到各自的计数器(一个用于人口,一个用于观察,一个用于预期) 。然后它转到下一个最接近的ZCTA并执行相同的操作,直到超过阈值。

这里的问题是我无法使用CSV模块读取这些文件,因为我已经从另一个文件读取并且索引将丢失。所以,我只需要使用常规filename.read(),然后需要对maketrans.translate进行一些有趣的使用。我不确定它的效率还是效果很好。一切似乎都很好,但没有修复上述问题,这是不可能的。我已经包含了下面的代码,但是想知道是否有人有更好的想法/建议?

`expectedCSV = open('ExpectedCases.csv', 'r', newline = '')
 table = str.maketrans('\r', ' ')
 content = expectedCSV.read()
 expectedCSV.close()
 content = content.translate(table)
 content = content.split(sep = '\n')
 newContent = []
 for item in content:
     newContent.append((item.split(sep= ',')))
 content = ' '
 for item in newContent:
     if item[0] == currentZcta:
          expectedTotal += (float(item[1]))
          totalPop += (float(item[2]))
          totalObservedCount += (float(item[3]))`

此外,我无法弄清楚如何为蓝色方法和变量红色着色,就像这个网站的一些更棒的用户那样。我非常有兴趣学习如何为将来的帖子做这件事。

如果有人需要更多信息或任何澄清来帮助回答/制定解决方案,请务必请教!感谢您花时间阅读!

1 个答案:

答案 0 :(得分:0)

所以,我最终通过打开每个ZCTA计算的文件来计算观察到的以及预期和人口来“解决”这个问题。这并没有真正解决我正在处理的问题,而是找到了解决问题的方法。我有点失望,因为更多的人没有看到和/或回应这个问题。如果有人想出实际问题的答案,请务必在此处发布。 -Mike