Đọc một tệp lớn trong bộ nhớ cùng một lúc có thể tiêu tốn toàn bộ RAM của máy tính và có thể gây ra lỗi. Trong những trường hợp như vậy, nó trở nên thích hợp để chia dữ liệu thành các phần. Những đoạn này sau đó có thể được đọc tuần tự và xử lý. Điều này đạt được bằng cách sử dụng tham số chunksize trong read_csv
Các khối kết quả có thể được lặp lại bằng cách sử dụng vòng lặp for. Trong đoạn mã sau, chúng tôi đang in hình dạng của các khối
for chunks in pd.read_csv['Chunk.txt',chunksize=500]: print[chunks.shape]
Các khối này sau đó có thể được nối với nhau bằng phương thức concat
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]
Trong bài viết này, chúng tôi sẽ cố gắng hiểu cách đọc một tệp văn bản lớn bằng cách nhanh nhất, sử dụng ít bộ nhớ hơn bằng Python.
Để đọc các tệp văn bản lớn trong Python, chúng ta có thể sử dụng đối tượng tệp làm trình vòng lặp để lặp qua tệp và thực hiện tác vụ được yêu cầu. Vì trình vòng lặp chỉ lặp lại trên toàn bộ tệp và không yêu cầu bất kỳ cấu trúc dữ liệu bổ sung nào để lưu trữ dữ liệu, nên bộ nhớ tiêu thụ tương đối ít hơn. Ngoài ra, trình vòng lặp không thực hiện các thao tác tốn kém như nối thêm, do đó, nó cũng tiết kiệm thời gian. Các tệp có thể lặp lại trong Python do đó nên sử dụng các trình vòng lặp
Sự cố với phương thức readline[] để đọc tệp văn bản lớn
Trong Python, các tệp được đọc bằng cách sử dụng phương thức readlines[]. Phương thức readlines[] trả về một danh sách trong đó mỗi mục của danh sách là một câu hoàn chỉnh trong tệp. Phương pháp này hữu ích khi kích thước tệp nhỏ. Vì phương thức readlines[] nối từng dòng vào danh sách và sau đó trả về toàn bộ danh sách nên sẽ tốn thời gian nếu kích thước tệp quá lớn, tính bằng GB. Ngoài ra, danh sách sẽ tiêu tốn một lượng lớn bộ nhớ, điều này có thể gây rò rỉ bộ nhớ nếu không có đủ bộ nhớ.
Đọc các tệp văn bản lớn trong Python bằng cách sử dụng lặp
Trong phương pháp này, chúng tôi sẽ nhập mô-đun fileinput. Phương thức input[] của mô-đun fileinput có thể được sử dụng để đọc các tệp lớn. Phương thức này lấy một danh sách các tên tệp và nếu không có tham số nào được truyền, nó sẽ chấp nhận đầu vào từ stdin và trả về một trình vòng lặp trả về các dòng riêng lẻ từ tệp văn bản đang được quét
Ghi chú. Chúng tôi cũng sẽ sử dụng nó để tính thời gian đọc tệp bằng thời gian Python
Python3
# import module
import
fileinput
import
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]0
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]1
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]2
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]3
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]4
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]5
import
0
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]3
import
2import
3 import
4import
5 import
6import
7import
8import
9fileinput
0
________ 81 ________ 82 ________ 83
fileinput
1import
0
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]3
import
0fileinput
8 fileinput
9fileinput
1
import
1
import
2____13
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]4
import
5
fileinput
2import
7import
8import
9
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]00
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]01
fileinput
2import
7
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]04
data=pd.read_csv['Chunk.txt',chunksize=500]data=pd.concat[data,ignore_index=True]print[data.shape]05
đầu ra
Cách nhanh nhất để đọc một tệp văn bản lớn bằng trình lặp của đối tượng tệp
Ở đây, điểm khác biệt duy nhất là chúng ta sẽ sử dụng iterator của một đối tượng file. Hàm open[] bọc toàn bộ tệp thành một đối tượng tệp. Sau đó, chúng tôi sử dụng một trình vòng lặp để lấy các dòng trong đối tượng tệp. Chúng tôi mở tệp trong khối 'với' vì nó sẽ tự động đóng tệp ngay sau khi toàn bộ khối thực thi
Có thể hữu ích trong một số ứng dụng để có thể đọc từng chút một tệp từ ISO và thực hiện một số xử lý trên đó. PyCdlib cung cấp API trình quản lý ngữ cảnh để cho phép mở tệp và đọc từng phần của tệp. Đây là mã hoàn chỉnh cho ví dụ này
try:
from cStringIO import StringIO as BytesIO
except ImportError:
from io import BytesIO
import pycdlib
iso = pycdlib.PyCdlib[]
iso.new[]
foostr = b'foofoo\n'
iso.add_fp[BytesIO[foostr], len[foostr], '/FOO.;1']
with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
all1 = infp.read[]
infp.seek[0]
first = infp.read[3]
second = infp.read[]
iso.close[]
Hãy xem xét kỹ hơn mã
try:
from cStringIO import StringIO as BytesIO
except ImportError:
from io import BytesIO
import pycdlib
Như chúng ta đã thấy trước đây, hãy nhập pycdlib. Chúng tôi cũng nhập mô-đun để có thể sử dụng chuỗi python làm đối tượng giống như tệp
iso = pycdlib.PyCdlib[]
iso.new[]
foostr = b'foofoo\n'
iso.add_fp[BytesIO[foostr], len[foostr], '/FOO.;1']
Mã này tạo một ISO mới, thêm một tệp vào đó và ghi nó ra. Điều này rất giống với mã trong Tạo ISO cơ bản mới, vì vậy hãy xem ví dụ đó để biết thêm thông tin
with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
Ở đây, chúng tôi sử dụng API để đưa trình quản lý ngữ cảnh vào tệp mà chúng tôi đã tạo;
Cuộc gọi
with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
2 đầu tiên đọc tất cả dữ liệu trong tệp, vì vậy khi kết thúc cuộc gọi, biến "tất cả" sẽ chứa with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
3Sau đó, cuộc gọi 'tìm kiếm' sẽ đặt lại con trỏ tệp về đầu tệp
Nếu API
with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
2 được truyền một số, nó sẽ đọc và trả về số byte đó. Trong trường hợp này, biến 'đầu tiên' sẽ chứa with iso.open_file_from_iso[iso_path='/FOO.;1'] as infp:
5