以最基本的方式阅读文件时:
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会做得更好。
答案 0 :(得分:1)
如果在文件传输期间出现损坏,则校验和将失败,您仍然应该能够阅读垃圾邮件。
读取失败的事实表明文件系统或介质损坏。