"-6ren"> "-我想对大文件进行 10 折交叉验证(每个文件都有数十万行)。我想在每次开始读取文件时执行“wc -l”,然后生成固定次数的随机数,每次将该行号写入一个单独的文件。我正在使用这个: import os -6ren">
gpt4 book ai didi

python - 在 Python 代码中运行 "wc -l "

转载 作者:太空狗 更新时间:2023-10-29 19:31:59 27 4
gpt4 key购买 nike

我想对大文件进行 10 折交叉验证(每个文件都有数十万行)。我想在每次开始读取文件时执行“wc -l”,然后生成固定次数的随机数,每次将该行号写入一个单独的文件。我正在使用这个:

import os 
for i in files:
os.system("wc -l <insert filename>").

如何在此处插入文件名。它是一个变量。我浏览了文档,但他们大多列出了 ls 命令,没有这个问题。

最佳答案

让我们比较一下:

from subprocess import check_output

def wc(filename):
return int(check_output(["wc", "-l", filename]).split()[0])

def native(filename):
c = 0
with open(filename) as file:
while True:
chunk = file.read(10 ** 7)
if chunk == "":
return c
c += chunk.count("\n")

def iterate(filename):
with open(filename) as file:
for i, line in enumerate(file):
pass
return i + 1

go go timeit 函数!

from timeit import timeit
from sys import argv

filename = argv[1]

def testwc():
wc(filename)

def testnative():
native(filename)

def testiterate():
iterate(filename)

print "wc", timeit(testwc, number=10)
print "native", timeit(testnative, number=10)
print "iterate", timeit(testiterate, number=10)

结果:

wc 1.25185894966
native 2.47028398514
iterate 2.40715694427

所以,wc 在 150 MB 的压缩文件上大约快两倍,有大约 500 000 个换行符,这是我测试过的。 但是,在使用seq 3000000 >bigfile 生成的文件上进行测试时,我得到了这些数字:

wc 0.425990104675
native 0.400163888931
iterate 3.10369205475

嘿,看,python FTW!但是,使用更长的行(~70 个字符):

wc 1.60881590843
native 3.24313092232
iterate 4.92839002609

所以结论:这取决于,但 wc 似乎是最好的选择。

关于python - 在 Python 代码中运行 "wc -l <filename>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520761/

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