代码之家  ›  专栏  ›  技术社区  ›  Mayor of the Plattenbaus

在Python中向csv文件写入超过65535行?

  •  0
  • Mayor of the Plattenbaus  · 技术社区  · 5 年前

    我在Python脚本中有以下逻辑:

    def importAndAnalyze(rowLimit = 3):
        layerProperties = iface.addVectorLayer("Downloads/parcels-shp/parcels.shp", "Parcels", "ogr")
        if not layerProperties:
            print("layerProperties failed to load!")
        layerEntrances = iface.addVectorLayer("Downloads/Metro_Stations-shp/Metro_Stations.shp", "Metro_Stations", "ogr")
        if not layerEntrances:
            print("layerEntrances failed to load!")
        features = layerProperties.getFeatures()
        counter = 0
        featuresSelected = []
        Path('Desktop/output.csv').touch()
    
        with open('Desktop/output.csv', 'w') as csvfile:
            csvWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
            csvWriter.writerow(['Tooltip', 'Lat','Lon', 'Distance'])
            for feature in features:
                if counter < rowLimit:
                    csvWriter.writerow([feature['TOOLTIP'], feature.geometry().centroid().asPoint().y(),feature.geometry().centroid().asPoint().x(), Ranker.calculateDistance(feature, layerEntrances)])
                    if counter % 100 == 0:
                        csvfile.flush()
                else:
                    break
                counter += 1
    
    Ranker.importAndAnalyze(1000000)
    

    当我向它提供800000行信息,将rowLimit变量设置为一百万时,它目前将65535行保存到output.csv文件中,然后停止保存新行,即使脚本继续运行数小时。

    如何让我的脚本保存其他734465行?

    ===

    编辑:评论/回答中有很多合理的猜测,关于我的 rowLimit 变量实际上设置为一百万。所以我添加了更多的代码来显示它是如何运行的。

    0 回复  |  直到 5 年前
        1
  •  2
  •   tripleee    5 年前

    这个 csv 模块本身没有这样的约束。当代码到达变量时,它停止写入 rowLimit (这在你的问题中没有定义),所以显而易见的简单解决方案是把它拿出来。

    这里有一个重构的尝试,它还可以重命名你的变量以符合Python的约定。

    with open('Desktop/output.csv', 'w') as csvfile:
        csv_writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
        csv_writer.writerow(['Tooltip', 'Lat','Lon', 'Distance'])
        for counter, feature in enumerate(features):
            # if counter == row_limit:
            #     raise StopIteration('row_limit reached')
            csv_writer.writerow([feature['TOOLTIP'], feature.geometry().centroid().asPoint().y(),feature.geometry().centroid().asPoint().x(), Ranker.calculateDistance(feature, layerEntrances)])
            if counter % 100 == 0:
                csvfile.flush()
    

    当然,您可以使用程序读取生成的CSV文件,但该文件无法处理任意大的文件;至少Excel似乎对大于65535行的工作表有问题(但朋友不允许朋友使用Excel)。

        2
  •  0
  •   shauli    5 年前
    with open('Desktop/output.csv', 'w') as csvfile:
        csvWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
        csvWriter.writerow(['Tooltip', 'Lat','Lon', 'Distance'])
        counter = 0
        for feature in features[:rowLimit]:
            csvWriter.writerow([feature['TOOLTIP'], feature.geometry().centroid().asPoint().y(),feature.geometry().centroid().asPoint().x(), Ranker.calculateDistance(feature, layerEntrances)])
            if counter % 100 == 0:
                csvfile.flush()
            counter += 1
        csvfile.flush()