gpt4 book ai didi

python - for line in open(..) 在文件中间意外挂起

转载 作者:太空狗 更新时间:2023-10-29 12:31:22 24 4
gpt4 key购买 nike

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

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".

文件操作在文件中间挂起,最后一个输出是“Last line of line-loop”,这意味着操作因某种原因卡在 for line in fh 上。

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

所以我想我会使用 epoll() 来代替 Watch 来阻塞读取:

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

但是由于不允许操作,这失败了,这在过去由于一些未知的原因在文件、套接字和标准输出管道上工作了很多次,但在这台机器上却没有?还是我只是运气好之前遇到了一些特殊的磁盘文件?

Debian,v7.5Python,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 |头
给我一行,而且只有一行。它应该给我更多。只运行 tail/file 也会挂起..

尝试了 file/file,它给了我:
... ASCII 文本,行很长

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) = ?

已提供所有帮助,我将调查此文件的文件传输。
该文件通过 64MB/s 传输速率的 LAN 之间的 scp 通过预定的 10 分钟窗口传输。这里可能出了点问题,也许 rsync 会做得更好。

最佳答案

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

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

读取失败表明文件系统或媒体损坏。

关于python - for line in open(..) 在文件中间意外挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26014764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com