gpt4 book ai didi

Python:寻求文件中的 EOL 不起作用

转载 作者:行者123 更新时间:2023-11-28 18:41:11 26 4
gpt4 key购买 nike

我有这个方法:

def get_chunksize(path):
"""
Breaks a file into chunks and yields the chunk sizes.
Number of chunks equals the number of available cores.
Ensures that each chunk ends at an EOL.
"""
size = os.path.getsize(path)
cores = mp.cpu_count()
chunksize = size/cores # gives truncated integer

f = open(path)
while 1:
start = f.tell()
f.seek(chunksize, 1) # Go to the next chunk
s = f.readline() # Ensure the chunk ends at the end of a line
yield start, f.tell()-start
if not s:
break

它应该将文件分成 block 并返回 block 的开始(以字节为单位)和 block 大小。

至关重要的是,一个 block 的结尾应该对应于一行的结尾(这就是 f.readline() 行为存在的原因),但我发现我的 block 没有在寻找完全停产。

该方法的目的是然后读取可以传递给 csv.reader 实例(通过 StringIO)进行进一步处理的 block 。

我一直无法发现该功能有任何明显的错误...知道为什么它没有进入 EOL 吗?

我想到了这个相当笨拙的替代方案:

def line_chunker(path):
size = os.path.getsize(path)
cores = mp.cpu_count()
chunksize = size/cores # gives truncated integer

f = open(path)

while True:
part = f.readlines(chunksize)
yield csv.reader(StringIO("".join(part)))
if not part:
break

这会将文件分成 block ,每个 block 都有一个 csv 阅读器,但最后一个 block 总是空的 (??) 并且必须将字符串列表重新连接在一起是相当笨重的。

最佳答案

if not s:
break

与其查看 s 以查看您是否在文件末尾,不如使用以下方法查看您是否已到达文件末尾:

if size == f.tell(): 中断

这应该可以解决它。不过,我不会依赖于每行只有一条记录的 CSV 文件。我处理过几个包含带换行符的字符串的 CSV 文件:

first,last,message
sue,ee,hello
bob,builder,"hello,
this is some text
that I entered"
jim,bob,I'm not so creative...

请注意第二条记录 (bob) 跨越 3 行。 csv.reader 可以处理这个。如果这个想法是在 csv 上做一些 cpu 密集型工作。我会创建一个线程数组,每个线程都有一个包含 n 条记录的缓冲区。让 csv.reader 使用循环将记录传递给每个线程,如果缓冲区已满则跳过线程。
希望这会有所帮助 - 享受吧。

关于Python:寻求文件中的 EOL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935813/

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