如何截断从另一个进程用作标准输出管道目标的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")
却没有任何作用。
如果您在另一个进程以模式打开truncate
文件1时w
,该进程将继续写入相同的偏移量,从而使文件稀疏。低偏移量将因此被读取为0
s。
根据x11-从多个进程同时写入日志文件-Unix&Linux Stack Exchange和两个Unix进程可以同时写入单个文件中的不同位置吗?,每个打开了文件的进程都具有其自己的偏移量,而a ftruncate()
不会改变它。
如果您希望其他进程对截断作出反应,则需要以a
模式打开它。
您的方法也存在主要错误。例如,它不是原子的:在生产者添加数据之后但在您读取数据之前,您可以(最终将)截断文件,以免丢失。
请考虑使用专用的数据缓冲实用程序,而不是像buffer
或pv
那样使用。在两个命令之间的管道中添加大缓冲区。
1 这是多余的,因为open(mode='w')
已经这样做了。要么truncate
重新打开,要么都不需要。