提问者:小点点

Python3.7 64 bit on Windows 7(64 bit):CSV-字段大于字段限制(131072)[重复]


_csv错误:字段大于字段限制(131072)不能解决我的问题。

我有一个脚本,将CSV文件处理成Excel报告。脚本工作得很好,直到一些特定的CSV文件变得相当大(目前

该脚本通常在Windows 7 64位上运行,因为团队使用的是Windows客户端。Python版本范围从3.6到3.7.2-都是64位。所有版本都会产生错误。

我得到第一名的错误是

_csv错误:字段大于字段限制(131072)

使用搜索功能,似乎很容易解决。但是当我包括

CSV.field_size_limit(s. max size)

这只会让事情变得更糟:

Traceback (most recent call last):
  File "CSV-to-Excel.py", line 123, in <module>
    report = process_csv_report(infile)
  File "CSV-to-Excel.py", line 30, in process_csv_report
    csv.field_size_limit(sys.maxsize)
OverflowError: Python int too large to convert to C long

根据我的研究,bug应该早就修好了。

我目前的解决方法是使用代码工作正常的Linux。然而,应该运行脚本的团队不能运行Linux而是被锁定在视窗上。

脚本的代码是

#!c:\python37\python.exe

import csv
import sys


def process_csv_report(CSV_report_file):
    files = []
    files.append(CSV_report_file+"_low.csv")
    files.append(CSV_report_file+"_med.csv")
    files.append(CSV_report_file+"_high.csv")
    first = True
    try:
        report = []
        for f in files:
            if first == True:
                with open(f, "r", newline='', encoding='utf-8') as csvfile:
                    original = csv.reader(csvfile, delimiter=',', quotechar='"')
                    for row in original:
                        report.append(row)
                first = False
            else:
                with open(f, "r", newline='', encoding='utf-8') as csvfile:
                    original = csv.reader(csvfile, delimiter=',', quotechar='"')
                    # for the second and third file skip the header line
                    next(original, None)
                    for row in original:
                        report.append(row)
    except Exception as e:
        print("File I/O error! File: {}; Error: {}".format(f, str(e)))
        exit(1)
    return report


if __name__ == "__main__":
    report = process_csv_report(infile)

看起来很简单,我迷失在解决这个问题上,因为为他人工作的解决方案在这里无缘无故地失败了。

最近有人看到这种情况发生在Python的最新版本上吗?


共1个答案

匿名用户

您可以将sys. maxsize替换为c整数max值,即2147483647

我知道sys. maxsize应该处理它,但我认为使用低于该屋顶的值,例如1.000.000应该可以解决您的问题。

更好的方法可能是min(sys. maxsize,2147483646)

_csv库是一个编译的扩展,然后它使用c变量。