kích thước trường csv được điều khiển thông qua [Python 3.Docs]: csv. trường_size_limit ( [new_limit] ) :
Trả về kích thước trường tối đa hiện tại được cho phép bởi trình phân tích cú pháp. Nếu new_limit được đưa ra, điều này trở thành giới hạn mới.
Nó được đặt theo mặc định là 128k hoặc 0x20000 ( 131072 ), mức này đủ cho bất kỳ .csv nào :
>>> import csv
>>>
>>> limit0 = csv.field_size_limit()
>>> limit0
131072
>>> "0x{0:016X}".format(limit0)
'0x0000000000020000'
Tuy nhiên, khi xử lý tệp .csv ( với trích dẫn và dấu phân cách chính xác ) có (ít nhất) một trường dài hơn kích thước này, lỗi sẽ bật lên.
Để thoát khỏi lỗi, nên tăng giới hạn kích thước (để tránh mọi lo lắng, giá trị tối đa có thể được thử).
Đằng sau hậu trường (kiểm tra [GitHub]: python / cpython - (master) cpython / Modules / _csv.c để biết chi tiết triển khai), biến giữ giá trị này là một C dài ( [Wikipedia]: Kiểu dữ liệu C ), có kích thước thay đổi tùy theo kiến trúc CPU và HĐH ( I L P ). Sự khác biệt cổ điển: đối với HĐH 64 bit (bản dựng Python ), kích thước loại dài (tính bằng bit ) là:
Khi cố gắng đặt nó, giá trị mới được kiểm tra ở các ranh giới dài , đó là lý do tại sao trong một số trường hợp, một ngoại lệ khác xuất hiện (trường hợp này là phổ biến trên Win ):
>>> import sys
>>>
>>> sys.platform, sys.maxsize
('win32', 9223372036854775807)
>>>
>>> csv.field_size_limit(sys.maxsize)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
Để tránh gặp phải vấn đề này, hãy đặt giới hạn (tối đa có thể) ( LONG_MAX ) bằng cách sử dụng một tạo phẩm (nhờ [Python 3.Docs]: ctypes - Thư viện hàm nước ngoài cho Python ). Nó nên hoạt động trên Python 3 và Python 2 , trên bất kỳ CPU / HĐH nào .
>>> import ctypes as ct
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
2147483647
>>> "0x{0:016X}".format(limit1)
'0x000000007FFFFFFF'
Python 64 bit trên Nix như HĐH :
>>> import sys, csv, ctypes as ct
>>>
>>> sys.platform, sys.maxsize
('linux', 9223372036854775807)
>>>
>>> csv.field_size_limit()
131072
>>>
>>> csv.field_size_limit(int(ct.c_ulong(-1).value // 2))
131072
>>> limit1 = csv.field_size_limit()
>>> limit1
9223372036854775807
>>> "0x{0:016X}".format(limit1)
'0x7FFFFFFFFFFFFFFF'
Đối với Python 32 bit , mọi thứ đều thống nhất: đó là hành vi gặp phải trên Win .
Kiểm tra các tài nguyên sau để biết thêm chi tiết về: