【问题标题】:Quickly opening and closing csv?快速打开和关闭csv?
【发布时间】:2013-06-22 16:42:06
【问题描述】:

我正在用 python 编写一个程序,将 csvs 转换为列表列表。它针对不同的文件多次执行此操作,因此我将其变成了一个函数。我没有遇到过这个错误,但我担心这是最 Pythonic/smartest/fastest 的方式,因为这些是巨大的 csv。

import csv

searchZipCode = #there's a zip code here
zipCoords = #there's a file here

def parseFile(selected):
    with open(selected) as selectedFile:
            selectedReader = csv.reader(selectedFile, delimiter=',')
            for row in selectedReader:
                    yield row

def parseZips():
    return parseFile(zipCoords)

zips = parseZips()
for row in zips:
    if row[0] == searchZipCode:
            searchState = row[1]
            searchLat   = row[2]
            searchLong  = row[3]
            print searchState 

基本上,我想知道为什么for row 必须重复两次。没有更优雅的解决方案吗?

【问题讨论】:

  • 你的parseFile 函数是一个生成器,所以你实际上只遍历每一行一次。您可以很好地解释什么是生成器here
  • 不,这看起来很“pythonic”生成器和上下文。 parseZips 函数看起来并没有真正发挥作用。不过其他一切看起来都不错。

标签: python csv for-loop generator yield


【解决方案1】:

您可以在读取行时简单地进行比较,而不是先生成然后迭代。

def findZip(selected, search):
    results = []
    with open(selected) as file:
        handle = csv.reader(file, delimiter=',')
        for row in handle:
            if row[0] == search
                results.append(row[1:4])
    return results

如果您希望进一步优化它,您可以在找到匹配项后跳出循环,前提是只有一个匹配项。

def findZip(selected, search):
    with open(selected) as file:
        handle = csv.reader(file, delimiter=',')
        for row in handle:
            if row[0] == search
                return row[1:4]

【讨论】:

  • 我在想产量可以防止它占用太多内存。可以根据需要进行尽可能多的匹配,这可能会变得很棘手。
  • 在这种情况下使用生成器没有任何作用。如果您只想根据请求创建大型数据,请使用生成器。在这种情况下,正常的功能将照常工作。
猜你喜欢
  • 2011-02-11
  • 2015-01-28
  • 2013-03-27
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多