如何从另一个进程截断用作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")
截断文件并没有任何作用
如果在另一个进程以
w
模式打开一个文件时truncate
,该进程将继续写入相同的偏移量,使文件稀疏。因此,低偏移量将被读取为0
s.根据x11 - Concurrent writing to a log file from many processes - Unix & Linux Stack Exchange和Can two Unix processes simultaneous write to different positions in a single file?,每个打开文件的进程都有自己的偏移量,而
ftruncate()
不会改变这一点如果希望另一个进程对截断作出反应,则需要在
a
模式下打开它。你的方法也有主要的缺陷。例如,它不是原子文件:在生产者添加数据之后,但在您读取之前,您可能会(最终)截断该文件,使其丢失
考虑使用专用数据缓冲工具,如^ {< CD6>}或^ {CD7>},如^ {A3}。
这是多余的,因为
open(mode='w')
已经这样做了。要么truncate
要么重新打开,无需两者都做。相关问题 更多 >
编程相关推荐