“运行”;wc-l<;文件名>&引用;在Python代码中
我想对巨大的文件进行10倍的交叉验证(每个文件运行数十万行)。我想在每次开始读取文件时做一个“wc-l”,然后生成固定次数的随机数,每次将行号写入单独的文件。我用的是:“运行”;wc-l<;文件名>&引用;在Python代码中,python,Python,我想对巨大的文件进行10倍的交叉验证(每个文件运行数十万行)。我想在每次开始读取文件时做一个“wc-l”,然后生成固定次数的随机数,每次将行号写入单独的文件。我用的是: import os for i in files: os.system("wc -l <insert filename>"). 导入操作系统 对于文件中的i: 操作系统(“wc-l”)。 如何在那里插入文件名。这是一个变量。我浏览了文档,但它们大多列出了ls命令,这些命令没有这个问题 无需使用wc-l使
import os
for i in files:
os.system("wc -l <insert filename>").
导入操作系统
对于文件中的i:
操作系统(“wc-l”)。
如何在那里插入文件名。这是一个变量。我浏览了文档,但它们大多列出了
ls
命令,这些命令没有这个问题 无需使用wc-l
使用以下python函数
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f, 1):
pass
return i
这可能比调用外部实用程序(以类似方式在输入上循环)更有效
更新
大错特错,wc-l
要快得多
os.system
获取字符串。只需显式构建字符串:
import os
for i in files:
os.system("wc -l " + i)
另请看一看-例如,如果您想以字符串形式访问输出,则需要使用子流程。请检查\u output()
,而不是子流程.call()
,让我们比较一下:
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压缩文件上的速度大约是50万换行符的两倍,这是我测试的然而,在使用seq 3000000>bigfile
生成的文件上进行测试时,我得到以下数字:
wc 0.425990104675
native 0.400163888931
iterate 3.10369205475
嘿,看,巨蟒FTW!但是,使用较长的行(~70个字符):
因此结论:这取决于,但wc似乎是最好的选择。我的解决方案与lazyr的“原生”函数非常相似:
import functools
def file_len2(fname):
with open(fname, 'rb') as f:
lines= 0
reader= functools.partial(f.read, 131072)
for datum in iter(reader, ''):
lines+= datum.count('\n')
last_wasnt_nl= datum[-1] != '\n'
return lines + last_wasnt_nl
与wc
不同,它将不以“\n”结尾的最后一行视为单独的一行。如果想要与wc相同的功能,那么它可以(非常不符合语法:)写为:
import functools as ft, itertools as it, operator as op
def file_len3(fname):
with open(fname, 'rb') as f:
reader= ft.partial(f.read, 131072)
counter= op.methodcaller('count', '\n')
return sum(it.imap(counter, iter(reader, '')))
在我生成的所有测试文件中,与wc
的时间相当
注意:这适用于Windows和POSIX机器。旧MacOS使用“\r”作为行尾字符。我找到了一种Python方法来解决这个问题:
count_of_lines_in_any_textFile = sum(1 for l in open('any_textFile.txt'))
我找到了一个更简单的方法:
import os
linux_shell='more /etc/hosts|wc -l'
linux_shell_result=os.popen(linux_shell).read()
print(linux_shell_result)
根据文件的大小,使用
wc
可能会更快,因为它是用C编写的。@ThiefMaster true,这一切都是关于了解您的输入是的,我的文件有3000万行。我认为这样计算会变慢。“在子shell中执行命令(字符串)。-如果文件列表来自不受信任的源,我会发现安全漏洞。我同意,但是os.system
一开始就是一个巨大的安全漏洞,正是因为这个原因。伙计们,我需要在部署中保留这个漏洞。这将直接投入生产。你们建议继续使用enumerate吗,即使它需要更长的时间?这给了我一个错误顺便说一句:(.Here:wc:invalid option--'g'Trywc--help'获取更多信息。256 wc:invalid option--'g'Try
wc--help'获取更多信息。256 wc:invalid option--'g'尝试'wc--help'获取更多信息。256[代码与上面所写的相同>,这也给了我一个错误。说明如下:回溯(最近一次调用):文件“../../scripts/gps_scripts/cross validation.py”,第10行,在print subprocess.call(['wc','-l',f])文件“/usr/lib/python2.7/subprocess.py”,第486行,在call return Popen(*Popen Popen Popen,**kwargs)。wait()文件中“/usr/lib/python2.7/subprocess.py”,第672行,在init errread,errwrite)文件中“/usr/lib/python2.7/subprocess.py”,第1213行,在_execute_child raise child_exception TypeError:execv()arg 2中只能包含strings@crazyaboutliv您向它传递了一个file对象而不是file name.one-liner以获取Python中的文件行数:int(子进程。检查_输出([“wc”,“-l”,fname])。解码(“utf8”).split()[0])
-@sudo,您的一行代码在我的windows 7框上非常有效,但在windows 10上不起作用。我得到FileNotFoundError:[WinError 2]系统找不到指定的文件。但我可以清楚地看到该文件存在。sudo的答案应该包含在正确的答案中。仅供参考,google说1 lakh==100000。虽然这段代码可能会回答这个问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。我不关闭f我在这里,是吗?或者Python垃圾收集器会帮你做这件事吗?
import functools as ft, itertools as it, operator as op
def file_len3(fname):
with open(fname, 'rb') as f:
reader= ft.partial(f.read, 131072)
counter= op.methodcaller('count', '\n')
return sum(it.imap(counter, iter(reader, '')))
count_of_lines_in_any_textFile = sum(1 for l in open('any_textFile.txt'))
import os
linux_shell='more /etc/hosts|wc -l'
linux_shell_result=os.popen(linux_shell).read()
print(linux_shell_result)