首页 > 解决方案 > 在 Python 中将超过 65535 行写入 csv 文件?

问题描述

我在 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)

当我向它提供 800,000 行信息时,将 rowLimit 变量设置为 100 万行,它当前正好将 65,535 行保存到 output.csv 文件中,然后停止保存新行,即使脚本继续运行数小时也是如此。

如何让我的脚本保存其他 734,465 行?

===

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

标签: pythoncsvfile

解决方案


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 似乎对大于 65,535 行的工作表有问题(但朋友不要让朋友使用 Excel)。


推荐阅读