温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - "_csv.Error: line contains NULL byte" after truncating a csv log file that is being piped to by anot
csv pipe python

python - 截断通过anot传递到的csv日志文件后,出现“ _csv.Error:行包含NULL字节”

发布于 2020-04-11 13:32:36

如何截断从另一个进程用作标准输出管道目标的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")却没有任何作用。

查看更多

提问者
metalaureate
被浏览
81
ivan_pozdeev 2020-02-02 08:31

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

根据x11-从多个进程同时写入日志文件-Unix&Linux Stack Exchange两个Unix进程可以同时写入单个文件中的不同位置吗?,每个打开了文件的进程都具有其自己的偏移量,而a ftruncate()不会改变它。

如果您希望其他进程对截断作出反应,则需要以a模式打开它


您的方法也存在主要错误。例如,它不是原子的:在生产者添加数据之后但在您读取数据之前,您可以(最终将)截断文件,以免丢失。

请考虑使用专用的数据缓冲实用程序,而不是像bufferpv那样使用在两个命令之间的管道中添加大缓冲区


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