截断另一进程通过管道传送到的csv日志文件后出现“_csv.Error:行包含空字节”

2024-10-02 10:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从另一个进程截断用作std out管道目标的csv日志文件,而不生成_csv.Error: line contains NULL byte错误

我有一个进程正在运行rtlamr > log/readings.txt,它将无线信号数据传输到readings.txt。我认为什么是管道到文件并不重要——任何长时间运行的管道进程都可以

我有一个文件监视程序,在该文件上使用watchdog(Python文件监视程序),它在文件更改时触发一个函数。函数读取文件并更新数据库

然后我试着截断readings.txt,这样它就不会无限增长(或者备份)

file = open(dir_path+'/log/readings.txt', "w")
file.truncate()
file.close()

这会损坏readings.txt并生成错误(文件开头包含垃圾字符)

我尝试移动文件而不是截断它,希望rtlamr能重新创建一个新文件,但这只会停止管道

编辑 我注意到字符集从us-ascii变为binary,但尝试用file = open(dir_path+'/log/readings.log', "w",encoding="us-ascii")截断文件并没有任何作用


Tags: 文件csvpath函数程序txtlog管道
1条回答
网友
1楼 · 发布于 2024-10-02 10:22:24

如果在另一个进程以w模式打开一个文件时truncate,该进程将继续写入相同的偏移量,使文件稀疏。因此,低偏移量将被读取为0s.

根据x11 - Concurrent writing to a log file from many processes - Unix & Linux Stack ExchangeCan two Unix processes simultaneous write to different positions in a single file?,每个打开文件的进程都有自己的偏移量,而ftruncate()不会改变这一点

如果希望另一个进程对截断作出反应,则需要在a模式下打开它。


你的方法也有主要的缺陷。例如,它不是原子文件:在生产者添加数据之后,但在您读取之前,您可能会(最终)截断该文件,使其丢失

考虑使用专用数据缓冲工具,如^ {< CD6>}或^ {CD7>},如^ {A3}。


这是多余的,因为open(mode='w')已经这样做了。要么truncate要么重新打开,无需两者都做。

相关问题 更多 >

    热门问题