我正在使用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执行以下命令: 给我一个文件夹中每个文件有多少行的列表,并使用并行(或任何其他好的多核心方法)来做它
答案 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 dir,getting number of lines in file和counting 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