我正在编写一个脚本,我正在从控制台运行它,就像这样
cat source_text/* | ./mapper.py
我希望得到当时每个文件的文件名。源文本文件夹包含一堆文本文件,其文件名我需要在我的映射器脚本中提取。
这可能吗?
import sys
import re
import os
# re is for regular expressions
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*",
re.MULTILINE | re.DOTALL | re.IGNORECASE)
# Read pairs as lines of input from STDIN
for line in sys.stdin:
....
答案 0 :(得分:1)
这是不可能的。您可以修改程序以直接从以下文件中读取:
import sys
import re
# re is for regular expressions
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*",
re.MULTILINE | re.DOTALL | re.IGNORECASE)
for filename in sys.argv[1:]:
with open(filename, "rU") as f:
for line in f.readlines():
if pattern.search(line) is not None:
print filename, line,
然后你可以用:
来调用它$ ./grep_files.py source_text/*
答案 1 :(得分:1)
你不能直接这样做,但fileinput模块可以帮助你。
你必须以这种方式打电话给你:
./mapper.py source_text/*
并以这种方式改变:
import fileinput
...
# Read pairs as lines of input from STDIN
for line in fileinput.input():
...
然后,正在处理的文件的名称可用fileinput.filename()
,您还可以访问当前文件中的行号fileinput.filelineno()
以及其他好东西......
答案 2 :(得分:1)
如果您使用此而不是cat:
grep -r '' source_text/ | ./mapper.py
mapper.py的输入将如下:
source_text/answers.txt:42
source_text/answers.txt:42
source_text/file1.txt:Hello world
然后您可以使用以下方法检索文件名:
for line in sys.stdin:
filename, line = line.split(':', 1)
...
然而,Python能够迭代目录中的文件并逐行读取它们,例如:
for filename in os.listdir(path):
for line in open(filename):
...