我正在处理大文件,我的问题是双重的。
Bash - 出于测试目的,我想迭代给定目录中的每个文件,并获取每个文件的Head
(例如Head
10000
) ,并留下每个的缩减版本。无论是在
相同的目录或其他目录并不重要,尽管我
假设同样是首选。
Python3 - 如何以编程方式执行此操作?我想我需要使用 os module ?
答案 0 :(得分:5)
<强>击:强>
最直接的方式:
#!/usr/bin/env bash
DEST=/tmp/
for i in *
do
head -1000 "${i}" > ${DEST}/${i}
done
如果您有大量文件,则可以通过生成文件列表,将其拆分以及针对每个列表运行循环来运行多个作业。
<强>的Python:强>
假设目标是不生成shell会话来执行外部二进制文件,比如'head',我就是这样做的。
#!/usr/bin/env python
import os
destination="/tmp/"
for file in os.listdir('.'):
if os.path.isfile( file ):
readFileHandle = open(file, "r")
writeFileHandle = open( destination + file , "w")
for line in range( 0,1000):
writeFileHandle.write(readFileHandle.readline())
writeFileHandle.close()
readFileHandle.close()
答案 1 :(得分:3)
使用shell:
尝试此操作for i in *; do
cp "$i" "$i.tail"
sed -i '10001,$d' "$i.tail"
done
或简单地说:
for i in *; do
sed '10001,$d' "$i" > "$i.tail"
done
或:
for i in *; do
head -n 1000 "$i" > "$i.tail"
done
对于python,如果您想使用shell代码,请参阅http://docs.python.org/2/library/subprocess.html。
答案 2 :(得分:-1)
要以这种方式缩写当前目录中的所有文件,您可以使用:
for f in *; do [[ $f != *.small ]] && head -n 10000 "$f" > "$f".small; done
文件的后缀为.small
。
要从python执行此操作,
import os
os.system('for f in *; do [[ $f != *.small ]] && head -n 10000 "$f" > "$f".small; done')