Cách đọc tệp liên tục trong Python

TL; DR Tóm tắtCố gắng tạo tập lệnh Python theo những thay đổi đột ngột trong tệp CSV được cập nhật theo thời gian thực

Giả sử một số chương trình ghi đầu ra của nó vào bảng CSV và luôn thêm các hàng mới vào bảng đó. Làm cách nào để viết tập lệnh Python hoặc Bash theo dõi phần tử cuối cùng của hàng cuối cùng của tệp CSV này trong thời gian thực và phát âm thanh cảnh báo nếu nó vượt quá một số giá trị giới hạn?

 

Hồi đáp

  • Ngày 13 tháng 6 năm 2022
  • #2

Borg

cố vấn khoa học

Thành viên vàng

2,0523,356

Tôi nghĩ rằng bạn sẽ gặp vấn đề về thời gian khi cố gắng đảm bảo một chương trình luôn nhìn thấy chính xác dòng cuối cùng được viết bởi một chương trình khác. Bạn đã xem xét kiến ​​trúc protobuf chưa? .

https. // nhà phát triển. Google. com/protocol-buffers/docs/pythontutorial

 

Hồi đáp

  • Ngày 13 tháng 6 năm 2022
  • #3

jedishrfu

Người cố vấn

thông tin chi tiết tác giả

14,0958,059

Ngăn xếp có ví dụ về một tệp đang được đọc trong khi nó đang được ghi. Một số nền tảng hệ điều hành có thể không cho phép điều này nên có khả năng nó không di động.

https. // stackoverflow. com/questions/60655818/read-from-file-while-it-is- being-write-to-in-python

Về cơ bản, đây là một đường dẫn phổ biến trong quá trình xử lý tệp Linux.

chương trình-a. chương trình-b. program-c

Đầu ra của program-a được chuyển thành đầu vào stdin cho program-b và thiết bị xuất chuẩn của program-b được chuyển cho program-c.

 

Hồi đáp

  • Like
Lượt thích jack

  • Ngày 13 tháng 6 năm 2022
  • #4

hibert2

cố vấn khoa học

thông tin chi tiết tác giả

Thành viên vàng

1,564582

Cảm ơn vì những lời khuyên. Tôi vừa thành công trong việc viết một tập lệnh bash Unix lộn xộn thực hiện những gì tôi dự định và tôi cũng sẽ cố gắng thực hiện điều này với protobuf và Python.

Các. tệp sh chứa

Mã.

#!/bin/ksh

while [ 1 == 1 ]
do
 line=$(tail -n 1 log.csv)
 count=`echo $line | awk -F, {'print NF'}`
 i=9
 str=`echo $line | cut -d, -f${i}`
 echo $str;
 if [ $str \> -5 ]
 then
    echo -ne '\007'
 fi
 sleep 1;
done


and it assumes that the last column is the 9:th one. The command "echo -ne '\007'" produces a beep sound from the computer, and this is done when the value of the last numerical element in the CSV exceeds -5.

 

Hồi đáp

  • Like
Lượt thích Borg

  • Ngày 13 tháng 6 năm 2022
  • #5

jedishrfu

Người cố vấn

thông tin chi tiết tác giả

14,0958,059

Protobuf có nghĩa là bạn đang sử dụng các tin nhắn được truyền giữa các chương trình chứ không phải các tệp đang được ghi. Protobuf là một cách tốt để gửi dữ liệu dưới dạng tin nhắn từ một chương trình dựa trên một ngôn ngữ nói Java sang một chương trình khác dựa trên nói python. Các liên kết thông báo protobuf sẽ đảm bảo dữ liệu được truyền chính xác.

Dưới đây là hướng dẫn ngắn gọn về bộ đệm giao thức của Google (hay còn gọi là protobuf) mô tả rõ hơn về nó cùng với ưu và nhược điểm cùng một số ví dụ.

https. //www. hướng dẫn. com/protobuf/protobuf_quick_guide. htm

ZeroMQ thực hiện chức năng giao tiếp liên chương trình tương tự và bạn có thể đọc về chức năng này tại đây.

https. // zeromq. org/

Nói chung, gửi tin nhắn qua Protobuf hoặc ZeroMQ là lựa chọn tốt hơn so với việc sử dụng cách ghi/đọc tệp khi quá trình lưu vào bộ đệm và xử lý song song có thể ảnh hưởng đến quá trình triển khai của bạn.

 

Hồi đáp

  • Ngày 14 tháng 6 năm 2022
  • #6

tom. G

cố vấn khoa học

Thành viên vàng

4,6473,394

Bạn muốn đọc kích thước tệp để xem nó có thay đổi không?
Hoặc là Thời gian ghi cuối cùng?

Tùy thuộc vào Hệ điều hành, chúng có thể .

Tôi biết MỘT SỐ ĐIỀU GÌ có thể xảy ra trong Windows vì tôi sử dụng Trình chỉnh sửa (Bảng văn bản) mà mỗi khi nó lấy lại tiêu điểm, nó sẽ thông báo nếu một tệp đang mở đã được cập nhật.

Chúc mừng bạn,
Tom

 

Hồi đáp

  • Like
Lượt thích jedishrfu

  • Ngày 14 tháng 6 năm 2022
  • #7

jedishrfu

Người cố vấn

thông tin chi tiết tác giả

14,0958,059

Thông thường, dữ liệu tệp không được cập nhật cho đến khi chương trình viết xóa bộ đệm

 

Hồi đáp

  • Ngày 14 tháng 6 năm 2022
  • #số 8

pbuk

cố vấn khoa học

người giúp việc nhà

Thành viên vàng

3,9702,326

Như những người khác đã đề cập, có nhiều cách giao tiếp giữa các chương trình tốt hơn là ghi vào hệ thống tệp, nhưng nếu đó là tất cả những gì bạn có và bạn đang sử dụng Linux thì có lẽ bạn muốn sử dụng inotify

 

Hồi đáp

  • Ngày 14 tháng 6 năm 2022
  • #9

vanadi 50

nhân viên danh dự

cố vấn khoa học

cố vấn giáo dục

giải thưởng 2021

29,35814,714

jedishrfu anh ấy nói

Thông thường, dữ liệu tệp không được cập nhật cho đến khi chương trình viết xóa bộ đệm

Và đôi khi thậm chí không - đĩa báo cáo cập nhật nhưng dữ liệu vẫn còn trong bộ đệm. Viết đôi khi có nghĩa là "thực sự được viết" và đôi khi có nghĩa là "dự định sẽ được viết khi chúng ta bắt đầu viết. "

 

Hồi đáp

  • Like
Lượt thích jedishrfu

  • Ngày 15 tháng 6 năm 2022
  • #10

hibert2

cố vấn khoa học

thông tin chi tiết tác giả

Thành viên vàng

1,564582

Tôi đã sử dụng Linux đó. mã sh để theo dõi đầu ra của ứng dụng rtl_power và để tạo âm thanh cảnh báo khi nhận thấy tín hiệu radio mạnh hơn tiếng ồn xung quanh ở một số tần số cụ thể. Khi tôi đặt nó theo dải tần 80-81 MHz mà taxi địa phương quanh đây sử dụng để liên lạc vô tuyến, nó dường như nhận thấy khi có một chiếc taxi đậu ở phía trước tòa nhà. Tập lệnh bash cần được sửa đổi để chuyển đổi cường độ radio decibel thành số nguyên dương để chúng có thể dễ dàng so sánh với một số giá trị ngưỡng. Dường như không gặp vấn đề gì khi cố đọc tệp đầu ra trong đó hàng cuối cùng được viết không đầy đủ