什么^ @登录.txt文件建议

时间:2013-07-05 09:35:37

标签: python linux file binaryfiles

我同时使用多个进程操作txt文件(一些r / w操作)。我看到了特殊标志的痕迹^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @偶尔在某些行上传播。这表明了什么?在什么情况下会出现这些符号。这是否意味着某些二进制内容被错误地写入了应该是文本的位置?

更新 我仔细阅读了文档。有人认为这是由于linux / windows平台上的换行问题,而其他人则认为这是因为网络环境中的大端/小端。事实是我在网络文件系统中运行多个进程并操纵一个常见的txt文件。所以我猜编码格式可能是主要原因。谁可以建议如何避免这个问题?我不想编辑文件(比如手动进行文本替换)。生成没有任何空字符的正确文件的简洁方法是首选。

UPDATE2 这是实现我的项目的python伪代码。 fcntl.lockf就是将公共被操作文件锁定在多个运行多个进程的机器上。

 while(manipulatedfile size is not 0):
           open(manipulatedfile, 'r+') as fh:
           fcntl.lockf(fh, fcntl.LOCK_EX)
           all_lines = fh.readlines()
           listing=all_lines[0:50] #get the first 50 lines
           rest_lines = all_lines[50:] # get remaining lines
           fh.seek(0)
           fh.truncate()
           fh.writelines(rest_lines) # write remaining lines back to file
           fcntl.lockf(fh, fcntl.LOCK_UN)
           listing = map(lambda s:s.strip(), listing)
           do_sth(listing)

感谢

2 个答案:

答案 0 :(得分:5)

在ASCII中,^@是二进制零(NUL)字符。

每个ASCII字符之间包含^@的数据有时可能会错误地从Unicode(4个字节到字符)转换为ASCII(1个字节到一个字符),反之亦然。

要删除^@个字符,请运行vi file.txt,然后输入:%s/ Ctrl + V Ctrl + @ //g并点击↵返回

有关详细信息,请参阅this detailed article

答案 1 :(得分:2)

这些是"file holes"并包含空字符。空字符(或NUL字符)的ASCII代码为0,在^@vi中查看时显示为less

当我几乎没有磁盘空间且进程正在尝试写入日志文件时,我通常会看到这些。