Trình tạo Python đọc tệp

def read_log_chunks(self, ti: TaskInstance, try_number: Optional[int],
                        metadata) -> Tuple[List[str], Dict[str, Any]]:
        """
        Reads chunks of Task Instance logs.

        :param ti: The taskInstance
        :type ti: TaskInstance
        :param try_number: If provided, logs for the given try will be returned.
            Otherwise, logs from all attempts are returned.
        :type try_number: Optional[int]
        :param metadata: A dictionary containing information about how to read the task log
        :type metadata: dict
        :rtype: Tuple[List[str], Dict[str, Any]]

        The following is an example of how to use this method to read log:

        . code-block:: python

            logs, metadata = task_log_reader.read_log_chunks(ti, try_number, metadata)
            logs = logs[0] if try_number is not None else logs

        where task_log_reader is an instance of TaskLogReader. The metadata will always
        contain information about the task log which can enable you read logs to the
        end.
        """

        logs, metadatas = self.log_handler.read(ti, try_number, metadata=metadata)
        metadata = metadatas[0]
        return logs, metadata 

Đây là một lưu ý nhanh để giúp giảm chi phí bộ nhớ khi đọc các tệp văn bản lớn. Tôi gặp sự cố khi tôi cần xử lý các tệp văn bản lớn có kích thước từ vài trăm MB đến vài GB và cách tải tệp truyền thống vào bộ nhớ đang làm chậm đáng kể máy tính. Đôi khi máy tính không phản hồi khi tệp đang được tải

Sau khi tìm kiếm và thử nghiệm một chút, chức năng tạo Python dường như giải quyết được vấn đề. Bài đăng này kết hợp hai giải pháp được cung cấp trong các liên kết sau

https. //www. tạp chídev. com/32059/read-large-text-files-in-python

https. // stackoverflow. com/questions/519633/lazy-method-for-reading-big-file-in-python

Trước khi đi đến giải pháp, tôi cần đề cập rằng một trong những trở ngại mà tôi gặp phải là do tệp nguồn ban đầu của tôi không có ngắt dòng rõ ràng. Tôi đang sử dụng chức năng cuộn để truy xuất 10.000 bản ghi Elaticsearch cùng một lúc và chỉ cần ghi chúng vào một tệp khác trước khi tải nó lên nhóm S3

Các tập tin sẽ trông giống như thế này

{{...}{...}{...}{...}{...}{...}{...}{...}{...}{...}}{{...}{...}{...}{...}{...}{...}{...}{...}{...}{...}}{{...}{...}{...}{...}{...}{...}{...}{...}{...}{...}}

Bước đầu tiên là làm cho các bản ghi được phân định rõ ràng bằng cách ngắt dòng trong tệp gốc, điều này làm tăng kích thước nhưng giúp việc phân tích cú pháp dễ dàng hơn rất nhiều

{...}

{...}

{...}

{...}

Tập lệnh đầu tiên sử dụng câu lệnh with open thông thường để mở tệp và lặp qua các dòng

#!/usr/bin/env python

import os

import resource

filename = 'largefile.txt'

{...}0

{...}1

{...}2

{...}3

{...}4

{...}5

{...}6

Tập lệnh thứ hai sử dụng hàm {...}7 để trả về từng dòng để xử lý trước khi tải dòng tiếp theo

#!/usr/bin/env python

import os

import resource

filename = 'largefile.txt'

{...}0

{...}3

{...}4

{...}5

{...}6

{...}7

{...}8

{...}9

{...}0

{...}1

Đây là kết quả hoạt động, số bộ nhớ tính bằng kilobyte (https. // trang chủ. debian. org/buster/manpages-dev/getrusage. 2. vi. html)

{...}2

{...}3

{...}4

{...}5

{...}6

{...}3

{...}8

Như liên kết ở trên cùng cho biết, chúng tôi cũng có thể sử dụng {...}9 để tải một đoạn nội dung tệp vào bộ đệm trước nếu tệp không được cấu trúc với ngắt dòng

Tôi hy vọng điều này mang lại một số giá trị cho mọi người khi họ cần xử lý một tệp văn bản lớn, tôi biết thỉnh thoảng tôi sẽ quay lại bài đăng này khi có nhu cầu

Một trong những nhiệm vụ phổ biến nhất mà bạn thực hiện trong công việc phát triển Python hàng ngày của mình có lẽ là đọc tệp. Khi bạn mở tệp để đọc, có ba chức năng thường được sử dụng

  • with open("test.txt", "r") as f_in:
    data = f_in.read()
    print(data)
    # Output:
    yellow
    pink
    black
    5. Đọc một lúc toàn bộ nội dung văn bản và trả về kết quả dưới dạng chuỗi ký tự
  • with open("test.txt", "r") as f_in:
    data = f_in.read()
    print(data)
    # Output:
    yellow
    pink
    black
    6. Chỉ đọc một dòng văn bản và trả về kết quả dưới dạng chuỗi
  • with open("test.txt", "r") as f_in:
    data = f_in.read()
    print(data)
    # Output:
    yellow
    pink
    black
    7. Đọc toàn bộ nội dung của văn bản và trả về kết quả dưới dạng
    with open("test.txt", "r") as f_in:
    data = f_in.read()
    print(data)
    # Output:
    yellow
    pink
    black
    8

Ví dụ: giả sử chúng ta có một tệp văn bản chứa

yellow
pink
black

Hành vi của ba chức năng trên sẽ giống như

đọc()

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black

dòng đọc ()

with open("test.txt", "r") as f_in:
data = f_in.readline()
print(data)
# Output:
yellow

đường đọc ()

________số 8_______

Tôi khá chắc rằng bạn đã sử dụng tất cả các chức năng trên, nhưng bạn đã bao giờ nghĩ về nguyên tắc đằng sau việc đọc tệp Python chưa?

Trước khi chúng tôi đi sâu vào cách làm việc với các tệp trong Python, điều quan trọng là phải hiểu chính xác tệp là gì và cách các hệ điều hành hiện đại xử lý một số khía cạnh của chúng

Tập tin là gì?

Về cốt lõi, một tệp là một tập hợp các byte liền kề được sử dụng để lưu trữ dữ liệu. Dữ liệu này được sắp xếp theo một định dạng cụ thể và có thể là bất kỳ thứ gì đơn giản như tệp văn bản hoặc phức tạp như tệp nhị phân. Trên hầu hết các hệ thống tệp, tệp bao gồm ba phần chính

  • tiêu đề tệp. siêu dữ liệu về nội dung tập tin
  • Dữ liệu. nội dung tập tin
  • Cuối tệp (EOF). Một ký tự đặc biệt cho biết phần cuối của tệp
    Dữ liệu này thể hiện điều gì tùy thuộc vào đặc tả định dạng được sử dụng, thường được biểu thị bằng phần mở rộng. Ví dụ, văn bản. csv, kiểm tra. exe hoặc kiểm tra. txt

Lưu ý Hệ thống Windows và Linux sử dụng các ký tự để kết thúc dòng. Sử dụng “kiểm tra. txt” làm ví dụ, nếu nó được tạo trên hệ thống Windows, nó sẽ giống như

yellow\r\n
pink\r\n
black\r\n
or
yellow^M
pink^M
black^M

Trên hệ thống Linux

yellow\n
pink\n
black\n
Đọc tệp kích thước nhỏ

Đọc một tệp có kích thước nhỏ (<500MB) khá đơn giản, dưới đây là cách thực hiện ba phương pháp

đọc()

try:
with open("big_file.txt", "r") as f_in:
data = f_in.read()
except IOError as e:
print(f"Error open files, {e}")

dòng đọc ()

try:
data = ""
with open("big_file.txt", "r") as f_in:
while True:
temp_data = f_in.readline()
if not temp_data:
break
data += temp_data
except IOError as e:
print(f"Error open files, {e}")

đường đọc ()

try:
with open("big_file.txt", "r") as f_in:
data = f_in.readlines()
except IOError as e:
print(f"Error open files, {e}")
Đọc tệp kích thước lớn

Mọi thứ bắt đầu trở nên thú vị khi đọc các tệp lớn (>500MB). Bạn cần hết sức lưu ý khi gọi các hàm

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
5 hoặc
with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
7 vì chúng có ý định tải toàn bộ tệp vào bộ nhớ, nếu không cẩn thận chương trình của bạn sẽ hết bộ nhớ.

Hàm

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
6 vẫn ổn vì nó chỉ đọc một dòng của tệp mỗi lần. Bạn có thể dễ dàng thực hiện nó như sau

try:
with open("read_large_files/bigfile.txt", "r") as f_in:
while True:
temp_data = f_in.readline()
if "testing" in temp_data:
print("Find word testing", temp_data)
# Process this line
if not temp_data:
break
except IOError as e:
print(f"Error open files, {e}")

Tuy nhiên, trong trường hợp sử dụng cực đoan, nếu toàn bộ tệp chỉ có một dòng thì sao?

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
0

Để đọc một tệp lớn một cách an toàn, chúng ta vẫn có thể sử dụng hàm

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
5, nhưng với tham số là size (số ký tự)

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
1

Trong đoạn mã trên, chúng ta truyền số nguyên 4096 (4k) làm tham số của hàm

with open("test.txt", "r") as f_in:
data = f_in.read()
print(data)
# Output:
yellow
pink
black
5, nghĩa là đọc 4k ký tự một lúc, cho đến khi không còn dữ liệu. Bằng cách này, ngay cả khi toàn bộ nội dung tệp chỉ chứa một dòng, bạn sẽ không gặp vấn đề về bộ nhớ

Làm cách nào để đọc tệp 10gb bằng Python?

Cách nhanh nhất của Python để đọc tệp văn bản lớn (vài GB) .
# Tập tin. readline-ví dụ-3. py
tệp = mở ("mẫu. txt")
trong khi 1
dòng = tập tin. đường đọc(100000)
nếu không dòng
nghỉ
cho dòng trong dòng
vượt qua # làm gì đó**văn bản mạnh**

Làm cách nào để đọc tệp văn bản trong Python?

Nếu bạn muốn đọc một tệp văn bản bằng Python, trước tiên bạn phải mở tệp đó. Nếu tệp văn bản và tệp hiện tại của bạn nằm trong cùng một thư mục ("thư mục"), thì bạn chỉ cần tham chiếu tên tệp trong hàm open().

Làm cách nào để phân tích một tệp trong Python?

Phân tích cú pháp văn bản ở định dạng phức tạp bằng biểu thức chính quy .
Bước 1. Hiểu định dạng đầu vào. 123. .
Bước 2. Nhập các gói cần thiết. Chúng ta sẽ cần mô-đun Biểu thức chính quy và gói gấu trúc. .
Bước 3. Định nghĩa biểu thức chính quy. .
Bước 4. Viết trình phân tích cú pháp dòng. .
Bước 5. Viết trình phân tích tệp. .
Bước 6. Kiểm tra trình phân tích cú pháp

Bạn có thể đọc một tệp trong hàm Python không?

Đây là một số hàm trong Python cho phép bạn đọc và ghi vào tệp. đọc() . Hàm này đọc toàn bộ tệp và trả về một chuỗi. dòng đọc (). Hàm này đọc các dòng từ tệp đó và trả về dưới dạng một chuỗi.