for open(..)中的行意外挂起中间文件

时间:2014-09-24 10:36:50

标签: python linux python-3.x file-io

以最基本的方式阅读文件时:

with open('/tmp/abs/path/file.txt', 'rb') as fh:
    for line in fh:
        print('New line...'
        # calculations
        print('Last line of line-loop')
    print('Ended up outside') # <-- Never reaches this either, which is "fine".

文件操作挂起mid文件,最后一个输出是“line-loop的最后一行”,这意味着操作由于某种原因挂起for line in fh

文件大小为5025728020字节
文件位置:26957152字节

所以我认为我会使用epoll()来监视阻塞读取:

with open('/tmp/abs/path/file.txt', 'rb') as fh:
    watcher = select.epoll()
    watcher.register(fh.fileno(), select.EPOLLIN)

但是operation not permitted失败,这在过去已经多次出现过一些未知的原因,包括文件,套接字和stdout管道,但是在这台机器上没有?或者我只是幸运地在一些特殊的磁盘文件之前?

Debian,v7.5 Python,v3.3.5

让我感到困惑的是,我有三个文件,一个是10亿字节,另一个只是3296字节。较大和较小的文件与相同的代码完美配合,提到的不是。

这让我很困惑,我甚至不知道从哪里开始。

python3.3 -m trace --trace script.py并且说:

script.py(112):                for line in fh:
script.py(113):                    print(fh.tell())
124124124
script.py(112):                for line in fh:

然后它就会挂起..永远......

编辑:它总是挂在同一个地方,尾巴也无法超越这一点 正在运行:tail -c+26956052 /file | head
给了我一行,只有一行。它应该给我更多。 仅运行tail /file也会挂起..

尝试file /file,它给了我:
... ASCII text, with very long lines

Martijn让我思考,突然之间我记得“dd”是叹息的东西。
dd if=file ibs=1 skip=26957150 count=100给了我:

;
100+0 records in
0+1 records out
100 bytes (100 B) copied, 5.5e-05 s, 1.8MB/s

此文件/硬件确实存在问题
strace cat /file > /dev/null给出:

read(3, " some data that is correc"..., 32768) = 32768
write(3, " some data that is correc"..., 32768) = 32768
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 32768) = 32768
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 1556) = 1556
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 1556) = 1556
read(3, "", 32768)                = 0
close(3)                          = 0
close(1)                          = 0
close(2)                          = 0
exit_group(0)                     = ?

所有帮助都是apriciated,我将调查此文件的文件传输 该文件通过预定的10分钟窗口通过64p / s传输的LAN之间的scp进行传输。这里可能出现问题,也许rsync会做得更好。

1 个答案:

答案 0 :(得分:1)

rsync有一些优点,自动校验和提供额外的保护(仅限scp)以防止内存损坏,但据我所知,写入后不会重新验证目标文件。

如果在文件传输期间出现损坏,则校验和将失败,您仍然应该能够阅读垃圾邮件。

读取失败的事实表明文件系统或介质损坏。