Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux下使用python通过终端计算文件夹中所有文件的行数_Python_Bash_Python 2.7_Ubuntu_Terminal - Fatal编程技术网

在linux下使用python通过终端计算文件夹中所有文件的行数

在linux下使用python通过终端计算文件夹中所有文件的行数,python,bash,python-2.7,ubuntu,terminal,Python,Bash,Python 2.7,Ubuntu,Terminal,我将Ubuntu与python 2.7结合使用 我需要把所有的文件放在一个文件夹里,分别计算每个文件中的行数,并将其转储到一个文件中 我发现了如何通过终端直接使用并行处理来实现这一点 当我尝试以下操作时,它崩溃: subprocess.Popen('ls %s* | parallel -k zcat {} | wc -l >%s'%(dir,outputfile), shell=True) 现在我试图通过python使用终端命令, 似乎它无法获取文件列表并将其用作文件,而只能计算文件列表

我将Ubuntu与python 2.7结合使用

我需要把所有的文件放在一个文件夹里,分别计算每个文件中的行数,并将其转储到一个文件中

我发现了如何通过终端直接使用并行处理来实现这一点

当我尝试以下操作时,它崩溃:

subprocess.Popen('ls %s* | parallel -k zcat {} | wc -l >%s'%(dir,outputfile), shell=True)
现在我试图通过python使用终端命令, 似乎它无法获取文件列表并将其用作文件,而只能计算文件列表的长度

p1 = subprocess.Popen(["ls", dest], stdout=subprocess.PIPE)
    output = subprocess.check_output(["wc", "-l"], stdin=p1.stdout)
当我需要每个文件中有多少行的列表时,提供文件夹中的文件数

如何使用python执行一个命令,该命令将:
给我一个文件夹中每个文件有多少行的列表,并将使用并行(或任何其他好的多重取芯方法)计算文件夹中的文件、目录和路径

import os

path, dirs, files = os.walk("/home/my_folder").next()
file_count = len(files)
计算文件中的行数,我试图找到一种方法,在不打开文件的情况下计算行数,但我做不到

with open(<pathtofile>) as f:
    print len(f.readlines())
以open()作为f的
:
打印长度(f.readlines())

现在您有了一个文件列表(在第一个示例中是变量文件),您只需要将这两段代码连接起来,就可以获得变量文件中每个文件的行数,实际上,您不需要使用外部进程在python中执行此任务。Python可以为您做这件事。以下是python3代码片段:

import os

for x in os.listdir(): 
    if os.path.isfile(x):
        with open(x, 'rb') as f:
            print('{} lines: {}'.format(x, sum(1 for line in x)))

以下是一些关于标准库的附加信息,您可以使用标准库中的内容,而无需支付:

导入操作系统

from multiprocessing import Pool

folder = '.'

fnames = (name for name in os.listdir(folder)
          if os.path.isfile(os.path.join(folder, name)))


def file_wc(fname):
    with open(fname) as f:
        count = sum(1 for line in f)
    return count


pool = Pool()

print(pool.map(file_wc, list(fnames)))
如果要记录文件名

def file_wc(fname):
    with open(fname) as f:
        count = sum(1 for line in f)
    return (fname, count)

print(dict(pool.map(file_wc, list(fnames))))

您可以将多处理与系统调用一起使用。您不必使用此处的队列,只需直接打印结果即可

import multiprocessing as mp
from subprocess import Popen, PIPE


output = mp.Queue()


def count_lines(path, output):
    popen = Popen(["wc", "-l", path], stdout=PIPE, stderr=PIPE)
    res, err = popen.communicate()
    output.put(res.strip())


popen = Popen(["ls", "."], stdout=PIPE, stderr=PIPE)
res, err = popen.communicate()


processes = [mp.Process(target=count_lines, args=(path.strip(), output)) for path in res.split('\n') if path]

# Run processes
for proc in processes:
    proc.start()

for proc in processes:
    proc.join()


results = [output.get() for proc in processes]
non_empty = [result for result in results if result]
print(non_empty)
参考:

使用bash背后的思想是已经在那里进行的多核心和优化,这是在unixshell中用一行代码解决fasterit的方法