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

时间:2017-06-21 14:16:46

标签: python bash python-2.7 ubuntu terminal

我正在使用Ubuntu和python 2.7,

我需要获取文件夹中的所有文件,并将每个文件中的行分开计算并将其转储到文件中。

我发现如何通过终端直接使用并行处理here

来实现

我尝试时崩溃了:

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执行以下命令: 给我一个文件夹中每个文件有多少行的列表,并使用并行(或任何其他好的多核心方法)来做它

4 个答案:

答案 0 :(得分:1)

您可以使用标准库中的内容而无需外壳:

导入os

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))))

答案 1 :(得分:0)

计算文件夹

中的文件,目录和路径
import os

path, dirs, files = os.walk("/home/my_folder").next()
file_count = len(files)

计算文件中的行数,我试图找到一种方法来计算行而不打开文件,但我不能

with open(<pathtofile>) as f:
    print len(f.readlines())

现在你有了一个文件列表(firts示例中的变量文件),您只需要连接这两段代码来获取变量文件中每个文件的行数

答案 2 :(得分:0)

实际上,您不需要使用外部进程在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)))

以下是有关listening files in dirgetting number of lines in filecounting lines for huge files

的一些其他信息

答案 3 :(得分:0)

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

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)

参考:

https://sebastianraschka.com/Articles/2014_multiprocessing.html