“运行”;wc-l<;文件名>&引用;在Python代码中

“运行”;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使

我想对巨大的文件进行10倍的交叉验证(每个文件运行数十万行)。我想在每次开始读取文件时做一个“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'Try
wc--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)